我有一个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;
}
然而,直到用户控件(网格)加载之后,进度条才会显示出来,所以我对如何工作的假设是错误的。我知道我之前让进度条在异步加载数据到已经初始化的datagrid时可以正常工作,但在这种情况下似乎不起作用,有什么想法是最好的方法吗?
发布于 2013-07-26 23:18:13
简单地说,用户控件很难在不同的线程上呈现。
首先,你需要知道进度条的动画也占用了UI线程,这意味着如果你耗时的作业在UI线程上,即使你的进度条正在显示,它也不会得到动画效果。因此,在加载用户控件时放置进度条不会像您预期的那样工作。
其次,您将两个UI操作放在一个事件处理程序中,WPF只有在完成当前操作后才能处理这些UI操作。由于您使用默认优先级为Normal为9(我认为)的Dispatcher.Invoke调用加载用户控件,而直接调用UI大约为Input为5,因此在加载用户控件后,您会看到进度条显示。
最后,您需要明确区分同步作业和异步作业。在您的情况下,所有与UI相关的都是同步作业,如果您有任何与数据相关的耗时作业,如获取报价,您可以将它们放在单独的线程中,在执行作业时显示进度条,然后在作业完成后加载用户控件。
https://stackoverflow.com/questions/17884417
复制相似问题