WPF闪屏UI不更新

问题描述 投票:0回答:2

我的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())几秒钟,看看用户界面是否会更新,但它从来没有更新。

为什么我的闪屏界面只有在我显示另一个对话框时才会更新?

c# wpf splash-screen
2个回答
3
投票

为什么我的spash UI只有在我显示另一个对话窗口时才会更新?

你完全阻塞了UI线程,这使得WPF无法处理和显示你的更新。

您需要将您的工作移到后台线程中。


0
投票

您可以使用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,你可以使用一个背景工作程序来初始化一切,然后用户报告进度来更新闪屏。我想这并不难。

© www.soinside.com 2019 - 2024. All rights reserved.