¿Por qué mi Silverlight BusyDicator permanece invisible después de configurar ISBUSY = verdadero?
-
24-10-2019 - |
Pregunta
Mi BusyDicator funciona como se esperaba cuando el DomainDataSource obtiene datos. Pero el control permanece invisible cuando configuré Isbusy en verdadero en código.
Estoy usando Silverlight 4 y el kit de herramientas abouthindicator. En XAML he atado la propiedad de BusyIndicator. El Control Control de BusyDicator envuelve mi cuadrícula principal (LayoUtroot) y todos los controles de los niños.
<toolkit:BusyIndicator IsBusy="{Binding ElementName=labSampleDomainDataSource, Path=IsBusy}" Name="busyIndicator1">
<Grid x:Name="LayoutRoot">
</Grid>
</toolkit:BusyIndicator>
El problema es que el BusyIndicator no se muestra cuando configuré BusyIndicator1 = True; En un evento de clic del botón. ¿Alguna idea de lo que estoy haciendo mal?
Solución
La interfaz de usuario se actualiza de manera bastante natural en el hilo de la interfaz de usuario. Eventos para cosas como clics de botones también se ejecutan en el hilo de la interfaz de usuario.
En algunos casos, los cambios de propiedad y las llamadas de método a los controles darán como resultado un método enviado al hilo de la interfaz de usuario. Lo que esto significa es que el método a invocar en realidad no ocurrirá hasta que el hilo de la interfaz de usuario esté disponible para ejecutarlo (y cualquier otra cosa que ya haya sido ejecutada). IsBusy
cae en esta categoría.
Solo cuando su código haya terminado con el hilo de la interfaz de usuario, la interfaz de usuario tendrá la oportunidad de actualizar su apariencia. No debería realizar tareas de larga duración en el hilo de la interfaz de usuario. En su caso, ata el hilo para hacer su propia oferta y dejar la interfaz de usuario hambrienta de este hilo que puede usar para hacer su trabajo.
En su lugar, debe buscar usar el BackgroundWorker
clase y hacer todo el trabajo pesado en su DoWork
evento que se ejecuta en un hilo diferente.
myButton_Click(object sender, RoutedEventArgs e)
{
isbusyindicator1.IsBusy = true;
var bw = new BackgroundWorker();
bw.DoWork += (s, args) =>
{
//Stuff that takes some time
};
bw.RunWorkerCompleted += (s, args) =>
{
isbusyindicator1.IsBusy = false;
};
bw.RunWorkerAsync();
}
Ahora, este evento de clic se completa muy rápidamente, lo que permite utilizar el hilo de la interfaz de usuario para actualizar la interfaz de usuario mientras el trabajo real se realiza en un hilo de fondo. Cuando se complete, se borra el ISBUSY.