当DomainDatasource获取数据时,我的繁忙指导者按预期工作。但是,当我将iSbusy设置为代码中时,控件保持不可见。

我正在使用Silverlight 4和Toolkit Busyindicator。在XAML中,我将忙碌的属性绑定到我的域DataSource控制的ISBUSY属性。忙碌的指控控制将我的主网格(Layurout)和所有子控制器包裹。

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

</Grid>
</toolkit:BusyIndicator>

问题在于,当我设置busyindicator1 = true时,忙碌的指标不会显示;在按钮点击事件中。知道我做错了什么?

有帮助吗?

解决方案

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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top