1

当页面需要时间加载时,我试图显示加载动画。我正在加载多个/几个用户控件,具体取决于使用 Thread 的用户请求。我尝试了以下方法

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

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

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

4

2 回答 2

0

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

于 2013-04-22T15:30:19.237 回答
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 线程在等待时不会阻塞,并且您的进度指示器将随着它的进行而更新。

于 2013-04-22T16:00:43.757 回答