在UI完成更新之前显示WPF加载消息

时间:2014-05-27 06:09:31

标签: c# wpf user-interface uirefreshcontrol

在我的应用程序中,我允许用户从左侧的项目树中选择一个项目,当该项目被选中时,我应该更新右侧的UI。现在,在更新UI期间(可能需要一两秒钟),我会显示“请等待”消息,指示应用程序当前正在通过后台线程工作。

当UI的加载完成后,我希望这个“请等待”窗口消失,但现在的问题是数据获取过程结束得非常快,这使得“请等待”窗口消失,但是用户界面尚未更新,应用程序暂停一段时间,然后,只有在UI更新后,它才会被释放。

在用户界面完成其工作并刷新后,如何仅发送消息以删除“请稍候”消息窗口? (我使用GalaSoft的Messenger类通过我的应用程序发送消息)

修改 这是我的参考代码:

// Show the "Please wait window" while running the long operation
var t = Task.Factory.StartNew(() => LoadingHelper.ShowProgressBar());

t.ContinueWith((priorTask) =>
                    {
                        // DOING SOME HEAVY LIFTING WORK HERE

                        // TRYING TO FORCE THE UI TO REFRESH
                        Application.Current.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { }));
                    });
t.ContinueWith((antecedent) => LoadingHelper.HideProgressBar()); // Make the loading window disappear

EDIT2:

我知道异步编程。我的问题主要是因为我的“繁重”工作已完成并且“请稍候”消息被删除,但用户界面令人耳目一新,以反映繁重工作的结果,这需要一些时间。我想在屏幕上保留“Please Wait”消息,直到所有UI都完成加载(可能是通过使用控件上的Loaded事件?)

2 个答案:

答案 0 :(得分:1)

一年太晚了,但是为什么不尝试等待渲染完成并发送?而不是强迫渲染?

也许摆脱界限,然后做

Application.Current.Dispatcher.Invoke(new Action(() => LoadingHelper.HideProgressBar()), DispatcherPriority.ContextIdle, null)

在您尝试强制渲染的确切线上?

答案 1 :(得分:0)

您正在寻找的是异步编程

阅读此http://msdn.microsoft.com/en-us/library/hh191443.aspx

这有助于您不希望阻止UI(以及因此对用户的UI反映不好)的确切情况,但需要在后台进行工作。

该文章中有一些可用的例子。

创建你的任务来完成繁重的工作。

创建一个异步void方法来调用任务并等待它。

在等待任务之前,请显示您的忙碌信息>等待任务>任务完成后,删除忙碌信息。

这里重要的是你要消除UI线程上的负载并将其交给另一个线程。目前听起来像你的UI线程正在进行比它需要更多的处理。