【问题标题】:WPF splash screen UI not updatingWPF初始屏幕UI未更新
【发布时间】:2015-02-16 23:37:03
【问题描述】:

我的 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 的 ViewModel 类,绑定到它,并更新视图模型的 Message 属性。
  • 在代码隐藏中创建一个名为 MessageDependencyProperty,并对其进行绑定/更新。
  • 直接设置属性(例如myTextBlock.Text = splashMessage;
  • 将启动画面放在单独的线程中,并通过Dispatcher.Invoke() 设置启动消息(使用DispatcherPriority.Send 确保立即更新UI)。

我的问题是没有任何启动屏幕消息在窗口上更新/显示。 only 条件是在 InitializeComponentX() 方法之一显示对话框时更新初始 UI。在这种情况下,启动界面会更新。对于上述所有选项,我什至尝试过同步和异步等待(通过Thread.Sleep())几秒钟以查看 UI 是否会更新,但它永远不会更新。

为什么我的启动界面只有在我显示另一个对话框/窗口时才会更新?

【问题讨论】:

    标签: c# wpf splash-screen


    【解决方案1】:

    为什么我的启动界面只有在我显示另一个对话框/窗口时才会更新?

    您完全阻塞了 UI 线程,这会阻止 WPF 处理和显示您的更新。

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

    【讨论】:

    • 那么,即使我尝试将启动画面移动到另一个线程,如果我阻塞主线程它仍然不会更新?
    • @SpikeX 您不能只是将 UI 元素移动到另一个线程 - UI 确实需要在主 UI 线程中更新。您应该将其他逻辑移到其他线程中。
    【解决方案2】:

    您可以使用 async 和 await 机制将组件的初始化推送到工作线程。像这样:

    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...");
    

    它需要对必须变为异步的初始化组件方法进行更改。但这不应该是一个很大的更新。 我还更新了方法名称以使其符合异步方法以“异步”结尾的约定。 这会释放 GUI 线程,并且应该会进行更新。

    如果您还没有此版本的 .NET,您可以使用后台工作程序和用户报告进度来初始化所有内容以更新初始屏幕。我觉得不太难。

    【讨论】:

    • 很遗憾,我的应用程序是.NET 4.0,我无权访问async/await
    • 然后您需要将初始化推送到后台工作人员并使用 reportprogress 同步启动画面
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多