WinUI 3桌面项目中如何在Activation阶段预加载ShellPage?
WinUI 3桌面应用:Activation阶段预加载ShellPage的解决方案
针对你遇到的首次启动时ShellPage未完成布局就加载MainPage的问题,可以通过以下几种方式确保ShellPage在导航页显示前完全加载:
1. 等待ShellPage的Loaded事件完成后再导航
ShellPage的Loaded事件触发时,其内部所有UI控件已完成布局和初始化。修改ActivationService的ActivateAsync方法,调整流程为:先将ShellPage设置为窗口内容,等待Loaded事件触发后再执行导航操作。
public async Task ActivateAsync(IActivatedEventArgs args) { // 其他激活逻辑... // 获取单例ShellPage实例 var shellPage = App.GetService<ShellPage>(); MainWindow.Content = shellPage; // 等待ShellPage加载完成 var loadCompletionSource = new TaskCompletionSource<bool>(); void OnShellLoaded(object sender, RoutedEventArgs e) { shellPage.Loaded -= OnShellLoaded; loadCompletionSource.SetResult(true); } shellPage.Loaded += OnShellLoaded; await loadCompletionSource.Task; // 导航至MainPage shellPage.NavigateTo(typeof(MainPage)); // 其他激活收尾逻辑... }
2. 提前实例化ShellPage(增强预加载)
既然已将ShellPage注册为单例,可以在App启动初期(服务配置完成后)主动实例化它,提前触发初始化流程。注意必须在UI线程执行此操作:
public App() { InitializeComponent(); // 服务配置... services.AddSingleton<ShellPage>(); services.AddSingleton<ShellViewModel>(); // 提前实例化ShellPage,触发初始化 _ = DispatcherQueue.EnqueueAsync(() => App.GetService<ShellPage>()); }
3. 优化ShellPage的异步初始化逻辑
如果ShellPage包含耗时的初始化操作(如加载远程资源、初始化依赖服务),将这些逻辑封装为异步方法,确保在导航前完成:
ShellPage代码:
public ShellPage() { InitializeComponent(); ViewModel = App.GetService<ShellViewModel>(); // 启动异步初始化 _ = InitializeShellAsync(); } public ShellViewModel ViewModel { get; } private async Task InitializeShellAsync() { // 执行耗时初始化操作 await ViewModel.LoadAppConfigAsync(); // 标记初始化完成 ViewModel.IsShellInitialized = true; }
在ActivationService中等待初始化完成:
await loadCompletionSource.Task; // 等待ViewModel初始化完成 while (!shellPage.ViewModel.IsShellInitialized) { await Task.Delay(10); } // 或者在ViewModel中提供TaskCompletionSource供外部等待 // await shellPage.ViewModel.InitializationCompletion.Task; shellPage.NavigateTo(typeof(MainPage));
这些方法的核心是确保ShellPage的布局、初始化操作完全完成后,再将MainPage加载到其Frame中,避免首次启动时的布局顺序问题。
内容的提问来源于stack exchange,提问作者aturnbul
相关产品推荐
相关产品推荐

