我正在尝试在页面花费时间加载时显示加载动画。我正在使用Thread根据用户请求加载多个/多个用户控件。我尝试了以下方法
this.Dispatcher.BeginInvoke(new Action(LoadSecondPageData), DispatcherPriority.Background);
当我使用它时,它会使我的加载动画冻结,直到页面加载
我也试过BackgroundWorker
概念加载动画在这里工作,但它不允许加载用户控件并给出错误。
错误:“调用线程必须是STA,因为许多UI组件都需要这个。”
答案 0 :(得分:0)
您需要使用Dispatcher.BeginInvoke
在主UI线程上启动动画,但任何数据加载都应该在后台线程上进行,以便动画不会冻结。
加载数据时,需要再次使用Dispatcher.BeginInvoke
将影响依赖项属性的任何最终更新编组到UI线程上。
答案 1 :(得分:0)
我也尝试过BackgroundWorker概念加载动画在这里工作,但它不允许加载用户控件并给出错误。
这是设计使然,您不允许在后台线程中触摸UI端的任何内容,因为它不是STA。相反,将进度指示器绑定到线程可以修改的属性,然后进度指示器将通过INotifyPropertyChanged事件获取更新。
例如,如果ProgressBar
绑定到ProgressPercentage
,或者绑定到IsBusy
的不确定繁忙指示符:
在XAML
:
<ProgressBar x:Name="StatusBar"
Maximum="1" Value="{Binding ProgressPercentage}" />
在Code
:
using (var backgroundWorker = new BackgroundWorker())
{
backgroundWorker.DoWork += (s, ex) =>
{
IsBusy = true;
StatusText = "Pretending to do something...";
for (int i = 0; i < 100; i++)
{
ProgressPercentage = (i + 1)/100.0D;
Thread.Sleep(100);
}
};
backgroundWorker.RunWorkerCompleted += (s, ex) =>
{
IsBusy = false;
StatusText = "Export Complete.";
};
backgroundWorker.RunWorkerAsync();
}
后台线程将完成其工作,UI线程在等待时不会阻塞,并且您的进度指示器将随着时间的推移而更新。