0

我有一个 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;
}

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

4

1 回答 1

0

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

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

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

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

于 2013-07-26T15:18:12.920 回答