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不更新的主要内容,如果未能解决你的问题,请参考以下文章

经典BugAndroid-初始化闪屏不消失

多线程更新UI的常用方法

wpf 动态更新 UI 而不会冻结 UI

强制 WPF UI 线程更新任务

WPF:在后台不断更新 UI

WPF Dispatcher.BeginInvoke子线程更新UI