为什么我的Silverlight Busyindicator在设置ISBUSY = true之后保持不可见?
-
24-10-2019 - |
题
当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。
不隶属于 StackOverflow