WPF闪屏UI不更新
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF闪屏UI不更新相关的知识,希望对你有一定的参考价值。
我的WPF应用程序中有一个闪屏。闪屏是在我的 App
类作为一个字段,并在 Startup
事件,我执行各种初始化功能,可能需要一些时间,显示提示窗口等。我的启动事件看起来是这样的。
Startup += (_,__) =>
{
mySplashScreen.UpdateMessage("Initializing Component A...");
InitializeComponentA();
mySplashScreen.UpdateMessage("Initializing Component B...");
InitializeComponentB();
mySplashScreen.UpdateMessage("Initializing Component C...");
InitializeComponentC();
mySplashScreen.UpdateMessage("Opening application...");
};
对于闪屏更新方法,我尝试了以下方法:
- 使用一个ViewModel类,实现
INotifyPropertyChanged
绑定到它,并更新视图模型的Message
属性。 - 创建一个
DependencyProperty
叫做Message
的代码中,并对其进行绑定。 - 直接设置属性(例如
myTextBlock.Text = splashMessage;
) - 将闪屏放在一个单独的线程中,并通过设置闪屏信息。
Dispatcher.Invoke()
(使用DispatcherPriority.Send
以确保用户界面立即更新)。)
我的问题是,所有的闪屏信息都没有在窗口上更新显示。我的问题是,所有的闪屏信息都没有在窗口上显示更新。只是 溅射界面更新的条件是当其中一个 InitializeComponentX()
方法显示一个对话框。在这种情况下,飞溅的UI就会更新。对于上面所有的选项,我甚至尝试了同步和异步等待(通过 Thread.Sleep()
)几秒钟,看看用户界面是否会更新,但它从来没有更新。
为什么我的闪屏界面只有在我显示另一个对话框时才会更新?
答案
为什么我的spash UI只有在我显示另一个对话窗口时才会更新?
你完全阻塞了UI线程,这使得WPF无法处理和显示你的更新。
您需要将您的工作移到后台线程中。
另一答案
您可以使用async和await机制将组件的初始化推送到一个workerthread中。类似这样的。
mySplashScreen.UpdateMessage("Initializing Component A...");
await InitializeComponentAAsync();
mySplashScreen.UpdateMessage("Initializing Component B...");
await InitializeComponentBAsync();
mySplashScreen.UpdateMessage("Initializing Component C...");
await InitializeComponentCAsync();
mySplashScreen.UpdateMessage("Opening application...");
它需要改变initialisecomponent方法,必须变成async。我还更新了方法名,使它们符合约定,即async方法以'Async'结尾,这就释放了GUI线程,更新应该会发生。
如果你还没有这个版本的.NET,你可以使用一个背景工作程序来初始化一切,然后用户报告进度来更新闪屏。我想这并不难。
以上是关于WPF闪屏UI不更新的主要内容,如果未能解决你的问题,请参考以下文章