You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:25:29