如何正确实现程序的启动画面

如何正确实现程序的启动画面

控件名:SplashScreen

作   者:WPFDevelopersOrg - 驚鏵

原文链接[1]:https://github.com/WPFDevelopersOrg/WPFDevelopers

码云链接[2]:https://gitee.com/WPFDevelopersOrg/WPFDevelopers

  • 框架支持.NET4 至 .NET8

  • Visual Studio 2022;

什么是启动页:应用每次冷启动过程中展示给用户的一个过渡页面,用于缓减用户打开应用时等待过程的焦虑情绪。

官方为 WPF 应用程序提供启动屏幕[3]SplashScreen

为什么选择 SplashScreen 而不是完整 WPF 窗口作为启动页?
  • 完整 WPF 窗口 :

    • 内存占用高:完整的 WPF 窗口通常会加载更多的控件和资源,因此其内存占用较高。

    • CPU 使用高:WPF 窗口可能涉及多个控件和后台计算,导致 CPU 使用较高,影响应用程序启动的响应速度和性能。

  • 原生 SplashScreen :

    • 内存占用极低:SplashScreen 仅加载一个简单的图像或动画,所需内存远低于完整的 WPF 窗口。

    • CPU 使用极低:SplashScreen 只显示一个静态或简单的过渡图像,不进行复杂的计算或渲染,因而消耗的 CPU 资源非常少。

SplashScreen 当 WPF 应用程序启动时,使用类在启动窗口或初始屏幕中显示图像。 Show 调用方法以显示初始屏幕。 Close 调用方法以关闭初始屏幕。

1. 修改 App.xaml.cs
  • 准备一张图片 Splash.png ,设置为资源;

  • 创建 Splash.Show(false, true) 非自动关闭,置顶显示;

  • 控制启动画面显示的最大时长 MaxSplashTime = 15000 ;

  • 关闭启动画面 CloseSplash();

using System.Windows;

namespaceWpfSplashScreen
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    publicpartialclassApp : Application
    {
        publicstatic SplashScreen Splash;
        privatestatic Timer _splashTimer;
        privateconstint MaxSplashTime = 15000;
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            Splash = new SplashScreen("/Splash.png");
            Splash.Show(false, true);
            _splashTimer = new Timer(state =>
            {
                Dispatcher.Invoke(() =>
                {
                    Splash.Close(TimeSpan.Zero);
                });
                _splashTimer?.Dispose();
            }, null, MaxSplashTime, Timeout.Infinite);
            var mainWindow = new MainWindow();
            mainWindow.Show();
        }

        public static void CloseSplash()
        {
            if (Splash != null)
            {
                Splash.Close(TimeSpan.Zero);
                Splash = null;
            }
            _splashTimer?.Dispose();
        }
    }
}
2. 修改 MainWindow.xaml.cs
  • 模拟主窗体准备数据耗时 8 秒;

  • 主窗体 Loaded 完成关闭 SplashScreen

public partialclassMainWindow
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;
        Thread.Sleep(1000 * 8);
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        App.CloseSplash();
    }
}

GitHub 源码地址[4]

Gitee 源码地址[5]

参考资料

[1] 

原文链接: https://github.com/WPFDevelopersOrg/WPFDevelopers

[2] 

码云链接: https://gitee.com/WPFDevelopersOrg/WPFDevelopers

[3] 

启动屏幕: https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.splashscreen?view=windowsdesktop-9.0&devlangs=csharp

[4] 

GitHub 源码地址: https://github.com/WPFDevelopersOrg/WPFDevelopers

[5] 

Gitee 源码地址: https://gitee.com/WPFDevelopersOrg/WPFDevelopers

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值