2013-04-22 116 views
1

我想在加载页面时显示加载动画。我使用Thread根据用户请求加载多个/多个用户控件。我曾尝试以下方法显示在wpf中加载动画

  1. this.Dispatcher.BeginInvoke(new Action(LoadSecondPageData), DispatcherPriority.Background); 当我用这它使我的加载动画冻结,直到页面加载

  2. 我也试过BackgroundWorker概念加载动画是在这里工作,但它是不允许加载usercontrols并给出错误。

错误:“调用线程必须是STA,因为很多UI组件都需要这个。”

+0

你在使用依赖注入吗?您是否使用在启动或程序集本身加载业务数据? – 2013-04-22 15:31:23

+0

是的我在启动时加载数据,但我没有使用任何依赖注入。我从外部文件中检索数据并根据页面加载的数据创建用户控件 – nandu 2013-04-22 15:39:46

+0

LoadSecondPageData中的内容是什么?你可以发布代码吗? – Dilshod 2013-04-22 16:05:43

回答

0

您需要使用Dispatcher.BeginInvoke在主UI线程上启动动画,但任何数据加载都应在后台线程上进行,以免动画冻结。 加载数据时,任何影响依赖项属性的最终更新都需要再次使用Dispatcher.BeginInvoke整理到UI线程中。

0

I also tried BackgroundWorker concept Loading animation is working here, but it is not allowing to load the usercontrols and giving an error.

这是设计,你不允许触摸后台线程中的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线程在等待时不会阻塞,并且你的进度指向icator会随着更新而更新。