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

来源:这里教程网 时间:2026-02-21 17:35:21 作者:

在 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
赋值前关闭该窗口,防止两个窗口同时存在造成焦点混乱

相关推荐