Avalonia怎么在程序启动时显示一个闪屏 Avalonia SplashScreen

推荐使用 Ursa.Avalonia 的 SplashWindow 实现 Avalonia 启动闪屏,它支持自定义 Logo、进度条、旋转图标和状态文本,可与 MVVM 无缝集成,并提供开箱即用的生命周期管理及防闪烁优化方案。

在 Avalonia 中实现启动闪屏(Splash Screen),推荐使用 Ursa.Avalonia 提供的 SplashWindow,它专为启动阶段设计,支持自定义 Logo、进度条、旋转加载图标和状态文本,且能与 MVVM 流程自然衔接。

用 Ursa.SplashWindow 快速搭建启动页

Ursa.Avalonia 内置了开箱即用的 SplashWindow,无需手动管理窗口生命周期。只需继承并配置即可:

  • 新建一个窗口类,如 CustomSplashWindow.xaml.cs,继承 u:SplashWindow
  • 在 XAML 中添加 Logo 图片、ProgressBarTextBlock,绑定 ViewModel 的 ProgressStatusMessage
  • 确保在 App.xaml.csOnFrameworkInitializationCompleted 中调用 SplashWindow.Show(),并在主窗口准备就绪后调用 SplashWindow.Close()

控制显示时机与关闭逻辑

闪屏不能过早关闭(资源未加载完),也不能卡住不关(影响用户体验)。关键点是:

  • AppBuilder 配置阶段不直接启动主窗口,而是先显示 SplashWindow
  • 将初始化逻辑(如 DI 容器构建、配置读取、资源加载)放在后台线程或异步任务中
  • 通过事件或命令通知 SplashWindow 更新进度;完成时触发 Close() 并同步打开主窗口
  • 避免在 UI 线程阻塞操作,否则会导致闪屏“假死”或闪烁异常

避免闪屏闪烁或跳动的细节

部分用户反馈闪屏“闪一下”,实际是窗口切换或重绘抖动所致,常见原因和对策:

  • 主窗口首次显示时未设置 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 赋值前关闭该窗口,防止两个窗口同时存在造成焦点混乱