【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去处理。

相关推荐
吾与谁归in3 小时前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf
昂好的day3 小时前
WPF 从零入门(上):WPF 是什么、XAML 语法、布局与样式全解
开发语言·c#·wpf
影寂ldy1 天前
WPF导航窗体+Page页面跳转 知识点整理
wpf
He BianGu1 天前
【WPF-Control教程】IOC 依赖注入
c#·wpf·wpf-control
He BianGu1 天前
【WPF-Control教程】H.Extensions.Behvaiors 开发文档
c#·wpf·wpf-control
He BianGu1 天前
【WPF-Control教程】H.Style 开发文档
c#·wpf·wpf-control
麻瓜code1 天前
分布式锁演进:从一个用户下两单,到 Redisson,我改了四版
分布式·wpf
He BianGu1 天前
【WPF-Control教程】MVVM 二次开发文档
c#·wpf·wpf-control
He BianGu1 天前
【WPF-Control教程】Theme 主题系统二次开发文档
c#·wpf·wpf-control
小羊没烦恼!4 天前
分布式事务 | 使用DTM 的Saga 模式
java·linux·运维·数据库·wpf