Avalonia 的 RenderTransform 用于视觉层面二维变换,不影响布局和命中测试;支持 RotateTransform(设 Angle 和中心点)、ScaleTransform(注意 CenterX/CenterY 及动画传控件)、TransformGroup 组合变换,需注意顺序与避坑点。
Avalonia 中的 RenderTransform 用于对控件进行**视觉层面的二维变换**,比如旋转、缩放、平移、倾斜。它不改变布局尺寸或命中测试逻辑(除非显式启用),只影响最终渲染效果。用法和 WPF 类似但有关键差异,尤其要注意对象类型和动画调用方式。
最常用的是 RotateTransform,通过 Angle 属性设置旋转度数(单位为度,正数顺时针)。
CenterX 和 CenterY 为控件中心,否则会“偏移飞走”。例如一个宽高均为 100 的按钮:CenterX="50" CenterY="50"
button.RenderTransform = new RotateTransform { Angle = 30, CenterX = 50, CenterY = 50 };ScaleTransform 通过 ScaleX 和 ScaleY 控制横向/纵向缩放比例(1.0 = 原尺寸,0.5 = 缩小一半,2.0 = 放大两倍)。
CenterX/CenterY 会导致缩放后控件“向左上偏移”。推荐设为控件宽高的一半(如 CenterX="Width/2",需在代码中计算)RunAsync() 的参数是目标控件(如 button),不能传 ScaleTransform 实例,否则报 InvalidCastException
var anim = new Animation();
anim.Duration = TimeSpan.FromSeconds(0.3);
anim.Children.Add(new KeyFrame
{
Cue = new Cue(0),
Setters = { new Setter(ScaleTransform.ScaleXProperty, 1.0) }
});
anim.Children.Add(new KeyFrame
{
Cue = new Cue(1),
Setters = { new Setter(ScaleTransform.ScaleXProperty, 1.3) }
});
anim.RunAsync(
button); // ← 这里传 button,不是 button.RenderTransform!单个 RenderTransform 只能设一个变换,如需叠加多个效果(比如先缩放再旋转),要用 TransformGroup。
button.RenderTransform = new TransformGroup
{
Children =
{
new ScaleTransform { ScaleX = 1.2, ScaleY = 1.2, CenterX = 50, CenterY = 50 },
new RotateTransform { Angle = 15, CenterX = 50, CenterY = 50 }
}
};TransformGroup 中子变换按添加顺序执行(先 Scale 再 Rotate),和矩阵乘法顺序一致,不可随意调换。这些细节直接影响效果是否正常:
LayoutTransform(Avalonia 当前未原生支持,需自定义或改用容器缩放)IsHitTestVisible="False"(如用于手势缩放),则点击事件失效;保持 True 才能响应点击/悬停等状态Viewbox 中时,RenderTransform 与 Viewbox 的缩放可能冲突,导致边框模糊、像素不对齐(尤其非整数缩放比下)SvgImage 使用 RenderTransform(如旋转 SVG 图标)非常稳定,适合做动态图标反馈