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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top