3

当 DomainDataSource 获取数据时,我的 BusyIndi​​cator 按预期工作。但是当我在代码中将 IsBusy 设置为 true 时,控件仍然不可见。

我正在使用 Silverlight 4 和工具包 BusyIndi​​cator。在 XAML 中,我已将 BusyIndi​​cator.IsBusy 属性绑定到我的 DomainDataSource 控件的 IsBusy 属性。BusyIndi​​cator 控件包装了我的主 Grid (LayoutRoot) 和所有子控件。

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

</Grid>
</toolkit:BusyIndicator>

问题是当我设置busyIndi​​cator1 = true时BusyIndi​​cator不显示;在按钮单击事件中。知道我做错了什么吗?

4

1 回答 1

7

UI 在 UI 线程上很自然地更新自己。诸如按钮点击之类的事件也在 UI 线程上运行。

在某些情况下,属性更改和对控件的方法调用将导致方法被分派到 UI 线程。这意味着要调用的方法实际上不会发生,直到 UI 线程可以执行它(并且已经执行了任何其他已经排队的东西)。 IsBusy属于这一类。

只有当您的代码完成 UI 线程时,UI 才有机会更新其外观。您不应该在 UI 线程中执行任何长时间运行的任务。在您的情况下,您将线程捆绑起来进行自己的竞标,并使 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();
}

现在这个点击事件很快完成,允许使用 UI 线程更新 UI,而实际工作在后台线程上完成。完成后 IsBusy 将被清除。

于 2011-01-25T18:17:31.963 回答