Почему мой Silverlight BusyIndicator остается невидимым после установки IsBusy = true? - PullRequest
3 голосов
/ 25 января 2011

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

Я использую Silverlight 4 и инструментарий BusyIndicator.В XAML я связал свойство BusyIndicator.IsBusy со свойством IsBusy моего элемента управления DomainDataSource.Элемент управления BusyIndicator оборачивает мою основную сетку (LayoutRoot) и все дочерние элементы управления.

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

</Grid>
</toolkit:BusyIndicator>

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

1 Ответ

7 голосов
/ 25 января 2011

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

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

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

Вместо этого вы должны использовать класс 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();
}

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

...