如何正确实现程序的启动画面
控件名: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