推荐使用 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 图片、
ProgressBar和TextBlock,绑定 ViewModel 的Progress和StatusMessage - 确保在
App.xaml.cs的OnFrameworkInitializationCompleted中调用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赋值前关闭该窗口,防止两个窗口同时存在造成焦点混乱









