异步加载UserControl

时间:2013-07-26 14:44:51

标签: wpf silverlight

我有一个WPF应用程序,当单击一个选项时,它会在内容(MetroContentControl)区域中加载用户控件(网格):                  

我的MetroContentControl被进度条包围,所以想法是在加载用户控件时加载IsBusy进度条:

private void ViewQuotes_OnClick(object sender, RoutedEventArgs e)
{
            RadBusyIndicator.IsBusy = true;
            Dispatcher.Invoke(new Action(() =>
            {
                // load datagrid control
                main.Content = new Quotes();
            }));
            //RadBusyIndicator.IsBusy = false;
}

然而,在加载usercontrol(grid)之后,进度条才会显示,所以我对这应该如何工作的假设是错误的。 我知道我以前在将数据异步加载到已经初始化的数据网格时,按预期工作进度条但是在这个实例中似乎没有工作 任何想法最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

简单地说用户控件很难在不同的线程上呈现。

首先,您需要注意进度条的动画也占用UI线程,这意味着如果您的耗时工作是在UI线程上,即使您的进度条显示,它也不会被动画化。因此,在加载用户控件时设置进度条不会像预期的那样工作。

其次,在事件处理程序中放置了两个UI操作,WPF只能在完成当前操作后处理这些UI操作。由于您使用Dispatcher.Invoke调用加载用户控件,默认优先级为Normal,9(我认为),直接调用UI位于Input,5附近,您会看到加载用户控件后显示进度条。

最后,您需要明确分离同步作业和异步作业。在您的情况下,所有与UI相关的是同步作业,如果您有任何与数据相关的耗时工作(如获取引号),您可以将它们放在单独的线程上,在执行作业时显示进度条,然后在作业完成后加载用户控件。