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

bxfogqkk  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(130)

在我的应用程序中,我允许用户从左侧的项目树中选择一个项目,当该项目被选中时,我应该更新右侧的UI。现在,在UI更新过程中(可能需要一两秒钟),我显示了一条“请等待”消息,表明应用程序当前正在通过后台线程工作。
当UI加载完成后,我希望让这个“请等待”窗口消失,但现在的问题是,数据获取过程结束得相当快,这使得“请等待”窗口消失,但由于UI尚未更新,应用程序卡住了一秒钟,然后,只有在UI更新后,它才被释放。
如何在UI完成工作并刷新后才发送消息删除“请等待”消息窗口?(我使用GalaSoft的Messenger类通过我的应用程序发送消息)

**EDIT:**这是我的代码供参考:

// 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

编辑2:

我知道异步编程。我的问题主要是因为我的“繁重”工作已经完成,“请等待”消息也被删除了,但是UI正在刷新以反映繁重工作的结果,这要花一些时间。我希望在所有UI完成加载之前一直在屏幕上显示“请等待”消息(可能通过在控件上使用Loaded事件?)

4dc9hkyq

4dc9hkyq1#

与其强制渲染,为什么不尝试等待渲染完成并调度呢?
也许摆脱了线,并做

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

在你尝试力渲染的那条线上

js81xvg6

js81xvg62#

您正在寻找的是异步编程
阅读此http://msdn.microsoft.com/en-us/library/hh191443.aspx
这有助于解决您不想阻塞UI(从而在UI上对用户造成不良影响),但需要在后台执行操作的情况。
那篇文章里有一些有用的例子。
创建任务来完成繁重的工作。
创建一个异步void方法来调用任务并等待它。
在等待任务之前,显示您的忙碌消息〉等待任务〉当任务完成时删除忙消息。
这里重要的是,您正在将UI线程上的负载转移给另一个线程。此时,听起来您的UI线程正在进行比它需要的更多的处理。

相关问题