Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF启动屏幕UI未更新_C#_Wpf_Splash Screen - Fatal编程技术网

C# WPF启动屏幕UI未更新

C# WPF启动屏幕UI未更新,c#,wpf,splash-screen,C#,Wpf,Splash Screen,我的WPF应用程序上有一个启动屏幕。启动窗口在我的App类中定义为一个字段,在Startup事件中,我执行各种初始化功能,这些功能可能需要一些时间,显示提示/窗口等。我的启动事件如下所示: Startup += (_,__) => { mySplashScreen.UpdateMessage("Initializing Component A..."); InitializeComponentA(); mySplashScreen.UpdateMessage("

我的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
    dependencProperty
    ,并绑定/更新该属性
  • 直接设置属性(例如,
    myTextBlock.Text=splashMessage;
  • 将启动屏幕放在单独的线程中,并通过
    Dispatcher.Invoke()
    (使用
    DispatcherPriority.Send
    设置启动消息,以确保UI立即更新)
我的问题是,窗口上没有更新/显示任何启动屏幕消息。只有当其中一个
InitializeComponentX()
方法显示对话框时,启动UI才会更新。在这种情况下,启动UI将更新。对于上面的所有选项,我甚至尝试过同步和异步等待(通过
Thread.Sleep()
)几秒钟,看看UI是否会更新,但从来没有更新过

为什么只有当我显示另一个对话框/窗口时,我的启动UI才会更新

为什么只有当我显示另一个对话框/窗口时,我的启动UI才会更新

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

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

为什么只有当我显示另一个对话框/窗口时,我的启动UI才会更新

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

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

为什么只有当我显示另一个对话框/窗口时,我的启动UI才会更新

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

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

为什么只有当我显示另一个对话框/窗口时,我的启动UI才会更新

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


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

您可以使用异步等待机制将组件的初始化推送到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”结尾的约定。 这将释放GUI线程,并且应该进行更新


如果您还没有此版本的.NET,您可以使用backgroundworker和用户报告进度来初始化所有内容,以更新初始屏幕。我认为不太难。

您可以使用异步和等待机制将组件的初始化推送到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”结尾的约定。 这将释放GUI线程,并且应该进行更新


如果您还没有此版本的.NET,您可以使用backgroundworker和用户报告进度来初始化所有内容,以更新初始屏幕。我认为不太难。

您可以使用异步和等待机制将组件的初始化推送到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”结尾的约定。 这将释放GUI线程,并且应该进行更新


如果您还没有此版本的.NET,您可以使用backgroundworker和用户报告进度来初始化所有内容,以更新初始屏幕。我认为不太难。

您可以使用异步和等待机制将组件的初始化推送到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”结尾的约定。 这将释放GUI线程,并且应该进行更新


如果您还没有此版本的.NET,您可以使用backgroundworker和用户报告进度来初始化所有内容,以更新初始屏幕。我想不太难。

所以,即使我尝试将启动屏幕移动到另一个线程,如果我阻止主线程,它仍然不会更新?@SpikeX你不能只将UI元素移动到另一个线程-UI确实需要在主UI线程中更新。您应该将其他逻辑移到其他线程中。因此,即使我尝试将启动屏幕移到另一个线程,如果我阻止主线程,它仍然不会更新?@SpikeX您不能只将UI元素移到另一个线程-UI确实需要在主UI线程中更新。您应该将其他逻辑移到其他线程中。因此,即使我尝试将启动屏幕移到另一个线程,如果我阻止主线程,它仍然不会更新?@SpikeX您不能只将UI元素移到另一个线程-UI确实需要在主UI线程中更新。你应该将你的其他逻辑移到其他线程中,尽管我试着移动启动屏幕