Почему мой Silverlight Busindicator остается невидимым после установки Isbusy = true?

StackOverflow https://stackoverflow.com/questions/4794851

Вопрос

Мой занятый индикатор работает так, как и ожидалось, когда DomainDataSource получает данные. Но управление остается невидимым, когда я устанавливаю Isbusy True в коде.

Я использую Silverlight 4 и Toolkit BusyNdicator. В XAML я связал свойство BusyNdicator. Управление BusyNdicator завершает мою основную сетку (Layoutroot) и все элементы управления.

<toolkit:BusyIndicator IsBusy="{Binding ElementName=labSampleDomainDataSource, Path=IsBusy}"  Name="busyIndicator1">
<Grid x:Name="LayoutRoot">

</Grid>
</toolkit:BusyIndicator>

Проблема в том, что занятость не показывает, когда я устанавливает ravinIndicator1 = true; В кнопке нажмите событие. Есть идеи, что я делаю не так?

Это было полезно?

Решение

Пользовательский интерфейс довольно естественно обновляется в потоке пользовательского интерфейса. События для таких вещей, как нажатия кнопок, также запускаются в потоке пользовательского интерфейса.

В некоторых случаях изменения свойства и вызовы метода в элементы управления приведут к тому, что метод отправляется в поток пользовательского интерфейса. Это означает, что метод, подлежащий обращению, на самом деле не произойдет до тех пор, пока поток пользовательского интерфейса не станет доступным для его выполнения (и все, что уже было в очереди, было выполнено). IsBusy попадает в эту категорию.

Только когда ваш код завершится с потоком пользовательского интерфейса, пользовательский интерфейс получит возможность обновить его появление. Вы не должны выполнять какие -либо долгие задачи в потоке пользовательского интерфейса. В вашем случае вы связываете ветку, чтобы выполнить свои собственные торговцы, и оставляете пользовательский интерфейс из этого одного потока, который он может использовать, чтобы выполнить свою работу.

Вместо этого вы должны использовать, чтобы использовать BackgroundWorker класс и выполняйте всю тяжелую работу в своем DoWork событие, которое работает на другой ветке.

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();
}

Теперь это событие Click заканчивается очень быстро, позволяя использовать поток пользовательского интерфейса для обновления пользовательского интерфейса, пока фактическая работа выполняется в фоновом потоке. При завершении ISBUSY очищается.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top