Avalonia动画通过Animation类和Storyboard实现,需作用于可动画依赖属性;XAML中声明Storyboard并用Style绑定Loaded事件,C#中需显式调用Storyboard.SetTarget和SetTargetProperty;支持RepeatBehavior、AutoReverse及缓动效果,注意目标属性必须是可动画的依赖属性。
在 Avalonia 中实现简单动画效果,主要依靠 Animation 类及其子类(如 DoubleAnimation、ColorAnimation)配合 Storyboard 控制,作用于控件的可动画属性(如 Opacity、Width、TranslateTransform.Y 等)。不需要第三方库,原生支持,但需注意属性必须是“依赖属性”且标记为可动画(Avalonia 已为常用属性预设好)。
这是最直观的方式:在资源中定义 Storyboard,绑定到目标控件的事件(如 Loaded 或按钮点击)。
示例:让一个 TextBlock 加载时 0.5 秒内从透明变不透明:
⚠️ 注意:Loaded 事件绑定需配合 Style + Setter 实现(Avalonia 当前不支持直接在元素上写 Loaded="{StaticResource FadeInStoryboard.Begin}")。
代码动态触发位移动画适合需要运行时计算、条件触发或与逻辑强耦合的场景。关键步骤:创建动画 → 设置目标和属性 → 添加到 Storyboard → 调用 Begin()。
示例:点击按钮,让方块向右平移 100 像素:
后台代码:
private void OnMoveClick(object? sender, RoutedEventArgs e)
{
var animation = new DoubleAnimation
{
From = MoveTransform.X,
To = MoveTransform.X + 100,
Duration = TimeSpan.FromSeconds(0.3),
Easing = new CubicEaseOut() // 可选缓动
};
var storyboard = new Storyboard();
Storyboard.SetTarget(animation, MoveTransform);
Storyboard.SetTargetProperty(animation, nameof(TranslateTransform.X));
storyboard.Children.Add(animation);
storyboard.Begin();
}
✅ 关键点:
- 动画目标必须是实际对象(如 MoveTransform),不是字符串路径
- 使用 Storyboard.SetTarget 和 SetTargetProperty 显式绑定
- CubicEaseOut 等缓动类型需引用 Avalonia.Animation.Easings
重复播放与状态控制
通过 RepeatBehavior 和 AutoReverse 可实现循环、呼吸效果等。
RepeatBehavior="Forever":无限循环RepeatBehavior="3x":重复 3 次AutoReverse="True":往返播放(如 0→1→0)storyboard.Pause() / storyboard.Resume()
storyboard.Stop()(会回到初始值)例如让按钮背景色呼吸闪烁:
? 注意:Background 是 IBrush 类型,其 Color 属性可动画的前提是使用 SolidColorBrush(默认 Brush 不支持动画)。
动画不起作用?大概率是以下原因之一:
AvaloniaProperty 且注册时启用动画(AvaloniaProperty.Register(..., enablesAnimation: true) )Storyboard.Target 或 TargetProperty(XAML 中用 Storyboard.TargetProperty,C# 中必须用 SetTarget + SetTargetProperty)AttachedToVisualTree 事件而非构造函数)Storyboard
基本上就这些。Avalonia 动画 API 简洁,逻辑清晰,掌握 Target + Property + Storyboard 三要素,就能覆盖大多数交互动画需求。