2010-01-22 15 views
12

Tengo un control de usuario WPF que contiene un DataGrid. Estoy vinculando un ObservableCollection de modelos de vista a la misma. Cada modelo de vista tiene otra colección de modelos de vista que estoy usando para vincular otro DataGrid a. Entonces el efecto es DataGrid con un DataGrid anidado contenido en la plantilla de detalles de la fila.Cómo mostrar un gráfico/animación de carga cuando se está produciendo el enlace de datos wpf

Normalmente, el enlace es bastante rápido, pero a veces, cuando hay una gran cantidad de datos, puede colgar la IU mientras se realiza el encuadernado/dibujo.

¿Hay alguna manera en que puedo mostrar una animación de carga o una barra de progreso mientras el enlace/dibujo está en progreso?

Respuesta

2

Probablemente hay una más formal, o al menos la solución más simple, pero se puede usar una ventana emergente modal que se muestra en un subproceso de trabajo y se cierra de forma asíncrona cuando su se rejilla hecha de carga:

Window waitWindow = new Window { Height = 100, Width = 200, WindowStartupLocation = WindowStartupLocation.CenterScreen, WindowStyle = WindowStyle.None }; 
waitWindow.Content = new TextBlock { Text = "Please Wait", FontSize = 30, FontWeight = FontWeights.Bold, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; 

BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += delegate 
{ 
    Dispatcher.BeginInvoke(new Action(delegate { waitWindow.ShowDialog(); })); 

    DataLoader dataLoader = new DataLoader(); // I made this class up 
    dataLoader.DataLoaded += delegate 
    { 
     Dispatcher.BeginInvoke(new Action(delegate() { waitWindow.Close(); })); 
    }; 

    dataLoader.LoadData(); 
}; 

worker.RunWorkerAsync(); 

Usted puede reemplazar el TextBlock con algo muy parecido a una barra de carga, y puede hacer que el código se vuelva a usar al parametrizar el objeto que maneja la carga de la (s) cuadrícula (s) y pasarlo a un método comúnmente usado.

Espero que funcione para usted.

+0

que poner la llamada a ShowDialog dentro delegado DoWork del subproceso de trabajo para manejar el caso en que se cargan los datos antes de que se abra la ventana (que muestra la ventana exterior del trabajador requiere que se haga al final, desde los bloques ShowDialog). No sé qué tan probable sería (si es que es posible) que suceda tal cosa, pero pensé que sería más seguro que introducir un error raro y difícil de rastrear. –

1

Puede usar un cursor de espera activado/desactivado con un desencadenador de datos.

Publiqué un código here.

2

Tuve el mismo problema y así es como lo resolví.

Descubrí que DataGrid solo comenzará a crear controles cuando muestre la cuadrícula. En mi caso, este fue el proceso que consumió mucho tiempo. ¡Después de buscar, descubrí que la creación de controles ocurre durante la medición!

Mi solución es anular MeasureOverride y colocar el cursor de espera alrededor de la llamada de la clase base. Encapsulé la configuración de mi cursor de espera en una clase. Entonces el código se ve así.

protected override Size MeasureOverride(Size availableSize) 
    { 
     using (new DisposableWaitCursor(this)) 
     { 
      return base.MeasureOverride(availableSize); 
     } 
    } 
Cuestiones relacionadas