我的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...");
};
对于闪屏更新方法,我尝试了以下方法:
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,你可以使用一个背景工作程序来初始化一切,然后用户报告进度来更新闪屏。我想这并不难。