在 Avalonia 中实现简单动画效果,主要依靠
Animation类及其子类(如
DoubleAnimation、
ColorAnimation)配合
Storyboard控制,作用于控件的可动画属性(如
Opacity、
Width、
TranslateTransform.Y等)。不需要第三方库,原生支持,但需注意属性必须是“依赖属性”且标记为可动画(Avalonia 已为常用属性预设好)。
用 XAML 声明一个淡入动画
这是最直观的方式:在资源中定义
Storyboard,绑定到目标控件的事件(如
Loaded或按钮点击)。
示例:让一个
TextBlock加载时 0.5 秒内从透明变不透明:
<Window xmlns="https://github.com/avaloniaui">
<Window.Resources>
<Storyboard x:Key="FadeInStoryboard">
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="0" To="1" Duration="0:0:0.5" />
</Storyboard>
</Window.Resources>
<p><Grid>
<TextBlock Name="MyText" Text="Hello!" Opacity="0" />
</Grid></p><p><Window.Styles>
<Style Selector="Window">
<Setter Property="Loaded" Value="{Binding #FadeInStoryboard.Begin}" />
</Style>
</Window.Styles>
</Window></p>⚠️ 注意:
Loaded事件绑定需配合
Style+
Setter实现(Avalonia 当前不支持直接在元素上写
Loaded="{StaticResource FadeInStoryboard.Begin}")。
用 C# 代码动态触发位移动画
适合需要运行时计算、条件触发或与逻辑强耦合的场景。关键步骤:创建动画 → 设置目标和属性 → 添加到 Storyboard → 调用 Begin()。
示例:点击按钮,让方块向右平移 100 像素:
<Button Content="Move Right" Click="OnMoveClick"/>
<Border Name="MovableBox" Width="60" Height="60" Background="Blue">
<Border.RenderTransform>
<TranslateTransform x:Name="MoveTransform"/>
</Border.RenderTransform>
</Border>后台代码:
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() // 可选缓动
};
<pre class="brush:php;toolbar:false;">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()(会回到初始值)
例如让按钮背景色呼吸闪烁:
<Storyboard x:Key="PulseStoryboard">
<ColorAnimation
Storyboard.TargetProperty="Background.Color"
From="#FF6A5ACD" To="#FFFFD700"
Duration="0:0:1.2" RepeatBehavior="Forever" AutoReverse="True" />
</Storyboard>? 注意:
Background是
IBrush类型,其
Color属性可动画的前提是使用
SolidColorBrush(默认
Brush不支持动画)。
常见问题与避坑提示
动画不起作用?大概率是以下原因之一:
目标属性不可动画:比如自定义控件的普通 .NET 属性,必须是AvaloniaProperty且注册时启用动画(
AvaloniaProperty.Register<t>(..., enablesAnimation: true)</t>) 未设置
Storyboard.Target或
TargetProperty(XAML 中用
Storyboard.TargetProperty,C# 中必须用
SetTarget+
SetTargetProperty) 动画 Duration 为 0 或负数(会立即完成,无视觉变化) 控件未加载完成就启动动画(建议监听
AttachedToVisualTree事件而非构造函数) 多个动画同时修改同一属性:后启动的会覆盖前一个,如需协同,统一用一个
Storyboard
基本上就这些。Avalonia 动画 API 简洁,逻辑清晰,掌握 Target + Property + Storyboard 三要素,就能覆盖大多数交互动画需求。
