什么是Transform转换
在WPF框架中有一个抽象类叫Transform,它定义了实现二维平面中的转换的功能。在WPF中Transform类被广泛应用于绘图元素的变换。作为大部分可视化控件的基类。
它包括旋转 (RotateTransform)、缩放 (ScaleTransform)、倾斜 (SkewTransform) 和平移 (TranslateTransform)4个子类。它定义如何将点从一个坐标空间映射或转换到另一个坐标空间。 此映射由转换 Matrix 来描述,它是一个三行三列 Double 值的集合。
这个类可以实现控件的各种转换,比如放置、缩放、倾斜和平移。
首先我们来看一下Transform的定义:
public abstract class Transform : GeneralTransform, IResource { public static Transform Identity { get; } public abstract Matrix Value { get; } public override GeneralTransform Inverse { get; } public static Transform Parse(string source); public Transform Clone(); public Transform CloneCurrentValue(); public override Rect TransformBounds(Rect rect); public override bool TryTransform(Point inPoint, out Point result); }
Identity表示获取一个Transform 标识转换,Value表示当前的Matrix矩阵变换,Inverse表示获取当前转换的反函数,它的类型是GeneralTransform。
对于任何Transform对象,一旦使用它去变换某个元素后,它的Inverse属性就会有值。它是GeneralTransform类型,也就是一个变换器,用于将元素变换到原始状态,相当于是Transform的反向操作。需要注意的是,Inverse是用于返回到原始状态的,而不上一次转换的状态。
以下内容来自官网的解释:
通过操作矩阵值,可以旋转、缩放、倾斜和移动(转换)对象。 例如,如果将第三行第一列的值(OffsetX 值)更改为 100,可使用它来将对象沿 x 轴移动 100 个单位。 如果将第二行第二列中的值更改为 3,可使用它来将对象的当前高度拉伸三倍。 如果同时更改这两个值,将使对象沿 x 轴移动 100 个单位,并将其高度拉伸 3 倍。 由于WPF仅支持仿射转换,因此右边列中的值始终为 0, 0, 1。
由于直接操作矩阵去设置旋转、缩放、倾斜和移动功能比较复杂,所以WPF提供了4个子类来设置相应的功能。例如,借助 ScaleTransform 类,通过设置其 ScaleX 和 ScaleY 属性即可缩放对象,而无需操作转换矩阵。 同样,借助 RotateTransform 类,只需设置其 Angle 属性,即可旋转对象。
下表中展示了2D转换
.
官方文档的注解:
A render transform does not regenerate layout size or render size information. Render transforms are typically intended for animating or applying a temporary effect to an element. For example, the element might zoom when focused or moused over, or might jitter on load to draw the eye to that part of the user interface (UI).
故可以通过更改UIElement的RenderTransform属性达到控件变换的目的,且开销较小。
注意到Transform类为抽象类,派生类型有:
System.Windows.Media.MatrixTransform
System.Windows.Media.TranslateTransform
System.Windows.Media.RotateTransform
System.Windows.Media.ScaleTransform
System.Windows.Media.SkewTransform
System.Windows.Media.TransformGroup
由于继承自System.Windows.Media.Transform ,上述各种变换中都具有Value的只读属性,其返回 Matrix 结构。