首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步加载UserControl

异步加载UserControl
EN

Stack Overflow用户
提问于 2013-07-26 22:44:51
回答 1查看 1.1K关注 0票数 0

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

我的MetroContentControl周围有一个进度条,所以当用户控件加载时,IsBusy进度条也会加载:

代码语言:javascript
运行
复制
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;
}

然而,直到用户控件(网格)加载之后,进度条才会显示出来,所以我对如何工作的假设是错误的。我知道我之前让进度条在异步加载数据到已经初始化的datagrid时可以正常工作,但在这种情况下似乎不起作用,有什么想法是最好的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2013-07-26 23:18:13

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

首先,你需要知道进度条的动画也占用了UI线程,这意味着如果你耗时的作业在UI线程上,即使你的进度条正在显示,它也不会得到动画效果。因此,在加载用户控件时放置进度条不会像您预期的那样工作。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17884417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档