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

本文关键字:显示 WPF 加载 消息 UI 更新 | 更新日期: 2023-09-27 18:05:23

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

当UI加载完成时,我希望使这个"请等待"窗口消失,但现在的问题是数据获取过程结束得很快,这使得"请等待"窗口消失,但由于UI尚未更新,应用程序被卡住了一秒钟,然后,只有在UI更新后,它才被释放。

如何在 UI完成其工作并刷新后发送消息仅删除的"Please Wait"消息窗口?(我使用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:

我知道异步编程。我的问题主要是,因为我的"繁重"工作已经完成,"请等待"消息被删除,但UI是刷新,以反映繁重工作的结果,这需要一些时间。我想保持"请等待"消息在屏幕上,直到所有的UI已经完成加载(也许通过使用Loaded事件上的控件?)

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

与其强制渲染,为什么不尝试等待渲染完成和调度呢?

也许去掉这行,然后写

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

在您正在尝试强制渲染的确切行?

你要找的是异步编程

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

当你不想阻塞UI(从而对用户的UI产生不良影响),但需要在后台完成工作时,这可以帮助你。

那篇文章中有一些有用的例子。

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

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

等待任务前,显示忙消息>等待任务>任务完成后,删除忙消息

这里重要的是,你正在拿走UI线程上的负载并将其交给另一个线程。此刻,听起来你的UI线程正在做比它需要更多的处理。