BeginInvoke en WPF

05/02/2009 - 00:45 por Leon | Informe spam
hola a todos.

Javier, quería preguntarte otra cosa con respecto a lo siguiente:

resulta que tengo que refrescar una pantalla window en donde pinto
dinámicamente
una especie de habitaciones con unos cuadritos, y les cambio el color (no lo
he implementado aún)
dependiendo del estado en que se encuentre (el estado es refrescado desde
otro lugar en otro pc, contra la base de datos).

En fin, el caso es que tengo una pantalla hecha en WPF, donde dibujo algunas
habitaciones y después de ésto trato de hacer el refresh asincrónicamente
(lo ví en un ejemplo en internet), pero la pantalla se está freezando.

Creo que estoy cerrando bien la conexión y liberando recursos.

En pocas palabras en esta aplicación solo se verá el estado de la
habitación, no se permitirá el ingreso de información.

Acá posteo el código para que depronto si saben depronto que estoy haciendo
mal.

De antemano te lo agradezco.

Perdonen por la identación, pero se pierde al pegarlo en el body del
mensaje.


using System;

using System.Configuration;

using System.Data;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Media;

using System.Windows.Shapes;

using System.Windows.Threading;

using System.Threading;

using MySql.Data.MySqlClient;



namespace AdmnistracionHabitaciones

{

/// <summary>

/// Interaction logic for Habitaciones.xaml

/// </summary>

public partial class Habitaciones : Window

{

public delegate void UpdateScreen();

DataSet dsDatos = new DataSet();


public Habitaciones() : base()

{

InitializeComponent();


InicioRefresh();

}

private void Window_Loaded(object sender, RoutedEventArgs e)

{

}

private void InicioRefresh()

{

canvas.Dispatcher.BeginInvoke(DispatcherPriority.Normal,

new UpdateScreen(MostrarHab));

}

#region MostrarHab

public void MostrarHab()

{

int iPiso = int.MinValue;

int iTop = int.MinValue;

int iLeft = int.MinValue;

bool bSemilla = false;

SolidColorBrush Brush = new SolidColorBrush(Colors.Cyan);

dsDatos = TraerDatos();

//Piso del primer registro, para iniciar la comparaci¢n

iPiso Convert.ToInt32(dsDatos.Tables[0].Rows[0]["intIdCama"].ToString().Substring(0,
1));

//Distancia del top y del left con respecto al Canvas, con q inician

iTop = 5;

iLeft = 5;

foreach (DataRow dr in dsDatos.Tables[0].Rows)

{

int idrPiso = Convert.ToInt32(dr["intIdCama"].ToString().Substring(0, 1));

if (bSemilla)

{

if (iPiso.Equals(idrPiso))

{

iLeft += 45;

}

else

{

iLeft = 5;

iTop += 45;

iPiso = idrPiso;

}

}

bSemilla = true;

Button btn = new Button();

btn.Name = "_" + dr["intIdCama"];

btn.Content = dr["intIdCama"].ToString() + dr["vcLetraCama"].ToString();

btn.Height = 42;

btn.Width = 43;

btn.IsEnabled = true;

btn.FontSize = 11;

btn.Background = Brushes.Aqua; //Brush;

btn.BorderBrush = Brushes.Black;

Canvas.SetLeft(btn, iLeft);

Canvas.SetTop(btn, iTop);

canvas.Children.Add(btn);

canvas.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.SystemIdle,

new UpdateScreen(this.MostrarHab));

//Thread.Sleep(4000);

}

}

#endregion



#region TraerDatos

private DataSet TraerDatos()

{

DataSet ds = new DataSet();

MySqlDataAdapter da = new MySqlDataAdapter();

MySqlConnection cnx = new
MySqlConnection(ConfigurationSettings.AppSettings["MySql"]);


da.SelectCommand = new MySqlCommand("SELECT camanovedad.intIdCama,
camas.vcletracama " +

" FROM camas INNER JOIN camanovedad ON " +

" (camas.intIdCama=camanovedad.intIdCama) " +

" ORDER BY camanovedad.intIdCama", cnx);

cnx.Open();

DataSet dsHab = new DataSet();

da.Fill(dsHab);



return dsHab;

if (da != null) da.Dispose();

cnx.Close();

}

#endregion

}

}
 

Leer las respuestas

#1 Javier Lozano
05/02/2009 - 00:54 | Informe spam
Leon

No me he encontrado todavia con ese problema, pero seguro que en este link
podras encontrar la informacion que necesitas para resoilver tu problema:

http://msdn.microsoft.com/en-us/mag...63328.aspx

Saludos

Javier Lozano
Lima-Peru

"Leon" wrote in message
news:
hola a todos.

Javier, quería preguntarte otra cosa con respecto a lo siguiente:

resulta que tengo que refrescar una pantalla window en donde pinto
dinámicamente
una especie de habitaciones con unos cuadritos, y les cambio el color (no
lo he implementado aún)
dependiendo del estado en que se encuentre (el estado es refrescado desde
otro lugar en otro pc, contra la base de datos).

En fin, el caso es que tengo una pantalla hecha en WPF, donde dibujo
algunas
habitaciones y después de ésto trato de hacer el refresh asincrónicamente
(lo ví en un ejemplo en internet), pero la pantalla se está freezando.

Creo que estoy cerrando bien la conexión y liberando recursos.

En pocas palabras en esta aplicación solo se verá el estado de la
habitación, no se permitirá el ingreso de información.

Acá posteo el código para que depronto si saben depronto que estoy
haciendo mal.

De antemano te lo agradezco.

Perdonen por la identación, pero se pierde al pegarlo en el body del
mensaje.


using System;

using System.Configuration;

using System.Data;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Media;

using System.Windows.Shapes;

using System.Windows.Threading;

using System.Threading;

using MySql.Data.MySqlClient;



namespace AdmnistracionHabitaciones

{

/// <summary>

/// Interaction logic for Habitaciones.xaml

/// </summary>

public partial class Habitaciones : Window

{

public delegate void UpdateScreen();

DataSet dsDatos = new DataSet();


public Habitaciones() : base()

{

InitializeComponent();


InicioRefresh();

}

private void Window_Loaded(object sender, RoutedEventArgs e)

{

}

private void InicioRefresh()

{

canvas.Dispatcher.BeginInvoke(DispatcherPriority.Normal,

new UpdateScreen(MostrarHab));

}

#region MostrarHab

public void MostrarHab()

{

int iPiso = int.MinValue;

int iTop = int.MinValue;

int iLeft = int.MinValue;

bool bSemilla = false;

SolidColorBrush Brush = new SolidColorBrush(Colors.Cyan);

dsDatos = TraerDatos();

//Piso del primer registro, para iniciar la comparaci¢n

iPiso > Convert.ToInt32(dsDatos.Tables[0].Rows[0]["intIdCama"].ToString().Substring(0,
1));

//Distancia del top y del left con respecto al Canvas, con q inician

iTop = 5;

iLeft = 5;

foreach (DataRow dr in dsDatos.Tables[0].Rows)

{

int idrPiso = Convert.ToInt32(dr["intIdCama"].ToString().Substring(0, 1));

if (bSemilla)

{

if (iPiso.Equals(idrPiso))

{

iLeft += 45;

}

else

{

iLeft = 5;

iTop += 45;

iPiso = idrPiso;

}

}

bSemilla = true;

Button btn = new Button();

btn.Name = "_" + dr["intIdCama"];

btn.Content = dr["intIdCama"].ToString() + dr["vcLetraCama"].ToString();

btn.Height = 42;

btn.Width = 43;

btn.IsEnabled = true;

btn.FontSize = 11;

btn.Background = Brushes.Aqua; //Brush;

btn.BorderBrush = Brushes.Black;

Canvas.SetLeft(btn, iLeft);

Canvas.SetTop(btn, iTop);

canvas.Children.Add(btn);

canvas.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.SystemIdle,

new UpdateScreen(this.MostrarHab));

//Thread.Sleep(4000);

}

}

#endregion



#region TraerDatos

private DataSet TraerDatos()

{

DataSet ds = new DataSet();

MySqlDataAdapter da = new MySqlDataAdapter();

MySqlConnection cnx = new
MySqlConnection(ConfigurationSettings.AppSettings["MySql"]);


da.SelectCommand = new MySqlCommand("SELECT camanovedad.intIdCama,
camas.vcletracama " +

" FROM camas INNER JOIN camanovedad ON " +

" (camas.intIdCama=camanovedad.intIdCama) " +

" ORDER BY camanovedad.intIdCama", cnx);

cnx.Open();

DataSet dsHab = new DataSet();

da.Fill(dsHab);



return dsHab;

if (da != null) da.Dispose();

cnx.Close();

}

#endregion

}

}



Preguntas similares