什麼是Transform轉換

小林野夫發表於2024-06-05

在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 結構。





相關文章