一、目的:简单介绍WPF中RenderTransform,LayoutTransform, VisualTransform区别
在 WPF 中,RenderTransform、LayoutTransform 和 VisualTransform 是用于对控件进行变换的属性,他们的主要区别是什么,如何选用合适的Transform,本文简要介绍。
它们的主要区别在于应用变换的时机和影响范围。
二、区别
RenderTransform
RenderTransform 是在渲染阶段应用的变换。它不会影响控件的布局,只会影响控件的外观。常用于动画和视觉效果。
• 应用时机: 在控件已经完成布局之后。
• 影响范围: 仅影响控件的外观,不影响布局。
**• 常见用途:**旋转、缩放、平移、倾斜等视觉效果。
示例:
XML
<Button Content="RenderTransform Example" Width="200" Height="50">
<Button.RenderTransform>
<RotateTransform Angle="45"/>
</Button.RenderTransform>
</Button>
LayoutTransform
LayoutTransform 是在布局阶段应用的变换。它会影响控件的布局,并且会触发重新布局。常用于需要影响布局的变换。
• 应用时机: 在控件布局之前。
• 影响范围: 影响控件的布局和外观。
• 常见用途: 旋转、缩放等需要影响布局的变换。
示例:
XML
<Button Content="LayoutTransform Example" Width="200" Height="50">
<Button.LayoutTransform>
<RotateTransform Angle="45"/>
</Button.LayoutTransform>
</Button>
VisualTransform
VisualTransform 是在视觉层次结构中应用的变换。它是 Visual 类的属性,通常在更底层的视觉对象中使用,而不是直接在控件中使用。
• 应用时机: 在视觉层次结构中。
• 影响范围: 影响视觉对象的外观。
• 常见用途: 更底层的视觉效果变换,通常不直接在控件中使用。
示例:
VisualTransform 通常不直接在 XAML 中使用,而是在更底层的视觉对象中使用。以下是一个使用 VisualTransform 的示例代码:
cs
// 假设你有一个自定义控件 MyVisualControl
public class MyVisualControl : Control
{
private VisualCollection _children;
private DrawingVisual _drawingVisual;
public MyVisualControl()
{
_children = new VisualCollection(this);
_drawingVisual = new DrawingVisual();
_children.Add(_drawingVisual);
using (DrawingContext dc = _drawingVisual.RenderOpen())
{
dc.DrawRectangle(Brushes.Blue, null, new Rect(0, 0, 100, 100));
}
// 应用 VisualTransform
_drawingVisual.Transform = new RotateTransform(45);
}
protected override int VisualChildrenCount => _children.Count;
protected override Visual GetVisualChild(int index)
{
return _children[index];
}
}
总结
• RenderTransform:在渲染阶段应用,不影响布局,常用于动画和视觉效果。
• LayoutTransform:在布局阶段应用,影响布局和外观,常用于需要影响布局的变换。
• VisualTransform:在视觉层次结构中应用,影响视觉对象的外观,通常在更底层的视觉对象中使用。
选择哪种变换属性取决于你需要的效果和变换的时机。如果你只需要改变控件的外观而不影响布局,使用 RenderTransform。如果你需要变换影响布局,使用 LayoutTransform。如果你在更底层的视觉对象中工作,可以使用 VisualTransform。
三、如何选择,性能上有什么区别
RenderTransform
• 性能特点:
• 高效 :因为 RenderTransform 仅在渲染阶段应用变换,不会触发重新布局,所以性能较高。
• 适用场景:适用于需要频繁更新的动画和视觉效果,例如旋转、缩放、平移等。
• 性能优势:
• 不会触发布局重算,减少了布局计算的开销。
• 适合需要高频率更新的场景,如动画。
LayoutTransform
• 性能特点:
• 较低效 :因为 LayoutTransform 会影响控件的布局,并且会触发重新布局,所以性能较低。
• 适用场景:适用于需要影响布局的变换,例如旋转、缩放等。
• 性能劣势:
• 会触发布局重算,增加了布局计算的开销。
• 不适合需要高频率更新的场景。
VisualTransform
• 性能特点:
• 高效:VisualTransform 是在视觉层次结构中应用的变换,通常用于更底层的视觉对象,性能较高。
• 适用场景:适用于需要对视觉对象进行变换的场景,通常不直接在控件中使用。
• 性能优势:
• 不会触发布局重算,减少了布局计算的开销。
• 适合需要高频率更新的场景,如动画。
VisualTransform 通常不直接在 XAML 中使用,而是在更底层的视觉对象中使用。以下是一个使用 VisualTransform 的示例代码:
总结
• RenderTransform:性能较高,因为它仅在渲染阶段应用变换,不会触发重新布局。适用于需要频繁更新的动画和视觉效果。
• LayoutTransform:性能较低,因为它会影响控件的布局,并且会触发重新布局。适用于需要影响布局的变换,但不适合高频率更新的场景。
• VisualTransform:性能较高,因为它在视觉层次结构中应用变换,不会触发重新布局。适用于更底层的视觉对象变换,通常不直接在控件中使用。
选择哪种变换属性取决于你的具体需求和性能考虑。如果你需要高效的变换效果,RenderTransform 和 VisualTransform 是更好的选择。如果你需要变换影响布局,LayoutTransform 是必要的,但要注意其性能开销。
需要了解的知识点
UIElement.RenderTransform 属性 (System.Windows) | Microsoft Learn
FrameworkElement.LayoutTransform Property (System.Windows) | Microsoft Learn
Visual.VisualTransform 属性 (System.Windows.Media) | Microsoft Learn
System.Windows.Controls 命名空间 | Microsoft Learn
源码地址
GitHub - HeBianGu/WPF-ControlDemo: 示例
GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库
GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库