show在wpf中加载动画

时间:2013-04-22 15:23:19

标签: wpf

我正在尝试在页面花费时间加载时显示加载动画。我正在使用Thread根据用户请求加载多个/多个用户控件。我尝试了以下方法

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

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

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

2 个答案:

答案 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线程在等待时不会阻塞,并且您的进度指示器将随着时间的推移而更新。