推荐使用 Ursa.Avalonia 的 SplashWindow 实现 Avalonia 启动闪屏,它支持自定义 Logo、进度条、旋转图标和状态文本,可与 MVVM 无缝集成,并提供开箱即用的生命周期管理及防闪烁优化方案。
在 Avalonia 中实现启动闪屏(Splash Screen),推荐使用 Ursa.Avalonia 提供的 SplashWindow,它专为启动阶段设计,支持自定义 Logo、进度条、旋转加载图标和状态文本,且能与 MVVM 流程自然衔接。
Ursa.Avalonia 内置了开箱即用的 SplashWindow,无需手动管理窗口生命周期。只需继承并配置即可:
CustomSplashWindow.xaml.cs,继承 u:SplashWindow
ProgressBar 和 TextBlock,绑定 ViewModel 的 Progress 和 StatusMessage
App.xaml.cs 的 OnFrameworkInitializationCompleted 中调用 SplashWindow.Show(),并在主窗口准备就绪后调用 SplashWindow.Close()
闪屏不能过早关闭(资源未加载完),也不能卡住不关(影响用户体验)。关键点是:
AppBuilder 配置阶段不直接启动主窗口,而是先显示 SplashWindow
Close() 并同步打开主窗口部分用户反馈闪屏“闪一下”,实际是窗口切换或重绘抖动所致,常见原因和对策:
WindowStartupLocation="CenterScreen",导致位置跳变 → 显式指定居中UserControl)时未重置窗口尺寸 → 改用固定大小窗口,或在切换后手动调用 LayoutManager.CalculateLayout()
Image 或自定义动画容器设置 RenderOptions.BitmapScalingMode="HighQuality" 和 UseLayoutRounding="True"
Window.Position 结合 Screen.AllScreens 获取当前活动屏坐标进行定位若不想引入 Ursa,也可手写一个极简 SplashWindow:
Window,设 WindowStyle="None"、CanResize="False"、ShowInTaskbar="False"
LoadingIcon(Ursa)或 RotateTransform + Storyboard 实现旋转动画DispatcherTimer 模拟进度,或监听主线程初始化完成事件Application.MainWindow 赋值前关闭该窗口,防止两个窗口同时存在造成焦点混乱