C# WPF启动屏幕UI未更新
我的WPF应用程序上有一个启动屏幕。启动窗口在我的C# WPF启动屏幕UI未更新,c#,wpf,splash-screen,C#,Wpf,Splash Screen,我的WPF应用程序上有一个启动屏幕。启动窗口在我的App类中定义为一个字段,在Startup事件中,我执行各种初始化功能,这些功能可能需要一些时间,显示提示/窗口等。我的启动事件如下所示: Startup += (_,__) => { mySplashScreen.UpdateMessage("Initializing Component A..."); InitializeComponentA(); mySplashScreen.UpdateMessage("
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
,并绑定/更新该属性dependencProperty
- 直接设置属性(例如,
)myTextBlock.Text=splashMessage;
- 将启动屏幕放在单独的线程中,并通过
(使用Dispatcher.Invoke()
设置启动消息,以确保UI立即更新)DispatcherPriority.Send
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线程中更新。你应该将你的其他逻辑移到其他线程中,尽管我试着移动启动屏幕