【WPF】MainWindow前添加加载窗口,发现加载过程中有白色无内容窗口闪烁一下的解决方案

问题描述:在MainWindow展示前添加了一个加载界面,用来处理一些耗时或需要提前加载的内容,但是发现加载窗口在加载的过程中会有一个白色没内容的窗口闪烁一下,其实是MainWindow的创建,即使给Visibility = Visibility.Hidden也是无用的主要问题用代码列出来
csharp 复制代码
 protected override Window CreateShell()
 {
     // 创建主窗口实例
     _mainWindow = Container.Resolve<MainWindow>();
     _mainWindow.Visibility = Visibility.Hidden;
     return _mainWindow;
 }
        
 protected override void InitializeShell(Window shell)
 {
     // 不调用 base.InitializeShell(shell),避免自动显示主窗口
     // 改为显示加载窗口,并启动加载流程
     _loadingWindow = new LoadingWindow();
     _loadingWindow.Show();

     // 异步加载配置
     _ = LoadConfigurationAsync();
 }
 
private async Task LoadConfigurationAsync()
{
    try
    {
        // 启动进度动画,持续 1 秒
        await _loadingWindow.StartLoadingAsync(1);

        if (Global.Instance.WebView2Environment == null)
        {
            Global.Instance.WebView2Environment = await CoreWebView2Environment.CreateAsync();
        }

        // 加载完成,关闭加载窗口并显示主窗口
        await Dispatcher.InvokeAsync(() =>
        {
            _loadingWindow.Close();
            _mainWindow.Visibility = Visibility.Visible;
            _mainWindow.Show();
            Application.Current.MainWindow = _mainWindow;
        });
    }
    catch (Exception ex)
    {
        LogException(ex, "配置加载异常");
        _loadingWindow.Close();
        MessageBox.Show("配置加载失败,程序将退出。", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
        this.Shutdown();
    }
}

修改后

csharp 复制代码
// 重写 Prism 方法,因为我们手动控制窗口
protected override Window CreateShell() => null;
protected override void InitializeShell(Window shell) { }
protected override void OnInitialized() => base.OnInitialized();

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    // 1. ★ 创建主窗口并隐藏,作为应用程序主窗口 ★
    _mainWindow = Container.Resolve<MainWindow>();
    _mainWindow.Visibility = Visibility.Hidden;
    Application.Current.MainWindow = _mainWindow;
    // 确保 ShutdownMode 为 OnMainWindowClose(默认就是)
    Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;

    // 2. 显示加载窗口
    _loadingWindow = new LoadingWindow();
    _loadingWindow.Show();

    // 3. 异步加载配置
    _ = LoadConfigurationAsync();
}

private async Task LoadConfigurationAsync()
{
    try
    {
        // 启动进度动画(持续1秒)
        await _loadingWindow.StartLoadingAsync(1);

        // 预创建 WebView2 环境
        if (Global.Instance.WebView2Environment == null)
        {
            Global.Instance.WebView2Environment = await CoreWebView2Environment.CreateAsync();
        }

        // 加载完成,关闭加载窗口并显示主窗口
        await Dispatcher.InvokeAsync(() =>
        {
            _loadingWindow.Close();
            _mainWindow.Visibility = Visibility.Visible;
            _mainWindow.Show();
        });
    }
    catch (Exception ex)
    {
        LogException(ex, "配置加载异常");
        _loadingWindow.Close();
        MessageBox.Show("配置加载失败,程序将退出。", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
        this.Shutdown();
    }
}

完结 主要就是不能交给CreateShell和InitializeShell去处理。

相关推荐
fogota3 天前
Emoji与Segoe MDL2 Assets的比较
c#·wpf
fogota3 天前
C# WPF 按钮加载字体图标 / 动物头像
c#·.net·wpf
fogota3 天前
C# WPF 按钮加载系统图标 / 动物头像
c#·.net·wpf
军训猫猫头3 天前
C# 封装 MySQL 自动写入与查询工具类(基于 MySqlConnector)
mysql·c#·.net·wpf
gis开发之家4 天前
Spring Boot 4 定时任务与异步线程池:从 @Scheduled 到高并发任务编排(生产级实战)
java·spring boot·后端·wpf·spring boot4
clz13145215 天前
如何设计一个优雅可靠的金融级联机接口
wpf
闲云自留地6 天前
云平台存储管理员:Cinder 创建挂载卷 + Swift 分布式存储原理
分布式·wpf·swift
敲代码的嘎仔7 天前
从集群锁失效到异步领券:我用分布式锁 + Redisson + MQ 把领券接口 RT 从 200ms 压到 15ms
java·数据库·redis·分布式·缓存·ai·wpf
闲云自留地7 天前
OpenStack 的身份管家:Keystone 令牌、RBAC 权限模型拆解
wpf·openstack
FuckPatience9 天前
WPF 窗体唤醒,判断是否已存在,存在则弹出
wpf