Przegląd Przekształcenia
W tym temacie opisano sposób używania klas 2D Transform do obracania, skalowania, przenoszenia (tłumaczenia) i niesymetryczności FrameworkElement obiektów.
Co to jest transformacja?
Element Transform definiuje sposób mapowania lub przekształcania punktów z jednej przestrzeni współrzędnej do innej przestrzeni współrzędnych. To mapowanie jest opisane przez przekształcenie Matrix, które jest kolekcją trzech wierszy z trzema Double kolumnami wartości.
Uwaga
Program Windows Presentation Foundation (WPF) używa macierzy głównych wierszy. Wektory są wyrażane jako wektory wierszy, a nie wektory kolumn.
W poniższej tabeli przedstawiono strukturę macierzy WPF.
Macierz transformacji 2D
Osi | Osi y | Przekształcenie affiny |
---|---|---|
M11 Ustawienie domyślne: 1.0 |
M12 Wartość domyślna: 0.0 |
0,0 |
M21 Wartość domyślna: 0.0 |
M22 Ustawienie domyślne: 1.0 |
0,0 |
OffsetX Wartość domyślna: 0.0 |
OffsetY Wartość domyślna: 0.0 |
1.0 |
Manipulując wartościami macierzy, można obracać, skalować, niesymetrycznie i przenosić (tłumaczyć) obiekt. Jeśli na przykład zmienisz wartość w pierwszej kolumnie trzeciego wiersza ( OffsetX wartości) na 100, możesz użyć jej do przeniesienia obiektu 100 jednostek wzdłuż osi x. Jeśli zmienisz wartość w drugiej kolumnie drugiego wiersza na 3, możesz użyć jej do rozciągnięcia obiektu na trzy razy więcej niż bieżąca wysokość. Jeśli zmienisz obie wartości, przeniesiesz obiekt 100 jednostek wzdłuż osi x i rozciągniesz jego wysokość przez współczynnik 3. Ponieważ program Windows Presentation Foundation (WPF) obsługuje tylko przekształcenia affine, wartości w prawej kolumnie są zawsze równe 0, 0, 1.
Mimo że program Windows Presentation Foundation (WPF) umożliwia bezpośrednie manipulowanie wartościami macierzy, udostępnia również kilka Transform klas, które umożliwiają przekształcanie obiektu bez znajomości konfiguracji podstawowej struktury macierzy. Na przykład ScaleTransform klasa umożliwia skalowanie obiektu przez ustawienie jego ScaleX właściwości i ScaleY zamiast manipulowania macierzą przekształceń. Podobnie RotateTransform klasa umożliwia obracanie obiektu przez ustawienie jego Angle właściwości.
Klasy przekształcania
Program Windows Presentation Foundation (WPF) udostępnia następujące klasy 2D Transform dla typowych operacji przekształcania:
Klasa | opis | Przykład | Ilustracja |
---|---|---|---|
RotateTransform | Obraca element według określonego Angleelementu . | Obracanie obiektu | |
ScaleTransform | Skaluje element według określonych ScaleX wartości i ScaleY . | Skalowanie elementu | |
SkewTransform | Niesymetrycznie elementu według określonej AngleX wartości i AngleY . | Pochylanie elementu | |
TranslateTransform | Przenosi (tłumaczy) element według określonej X wartości i Y . | Przesuwanie elementu |
W przypadku tworzenia bardziej złożonych przekształceń program Windows Presentation Foundation (WPF) udostępnia następujące dwie klasy:
Klasa | opis | Przykład |
---|---|---|
TransformGroup | Grupuje wiele TransformGroup obiektów w jeden Transform , który można następnie zastosować do przekształcania właściwości. | Stosowanie wielu przekształceń do obiektu |
MatrixTransform | Tworzy przekształcenia niestandardowe, które nie są udostępniane przez inne Transform klasy. Gdy używasz elementu MatrixTransform, bezpośrednio manipulujesz macierzą. | Tworzenie niestandardowych przekształceń przy użyciu elementu MatrixTransform |
Program Windows Presentation Foundation (WPF) udostępnia również przekształcenia 3D. Aby uzyskać więcej informacji, zobacz klasę Transform3D .
Typowe właściwości przekształcania
Jednym ze sposobów przekształcenia obiektu jest zadeklarowanie odpowiedniego Transform typu i zastosowanie go do właściwości transformowania obiektu. Różne typy obiektów mają różne typy właściwości przekształcania. W poniższej tabeli wymieniono kilka powszechnie używanych typów programu Windows Presentation Foundation (WPF) i ich właściwości przekształcania.
Type | Właściwości przekształcenia |
---|---|
Brush | Transform, RelativeTransform |
ContainerVisual | Transform |
DrawingGroup | Transform |
FrameworkElement | RenderTransform, LayoutTransform |
Geometry | Transform |
TextEffect | Transform |
UIElement | RenderTransform |
Przekształcenia i systemy współrzędnych
Podczas przekształcania obiektu nie tylko przekształcasz obiekt, przekształcasz przestrzeń współrzędnych, w której istnieje ten obiekt. Domyślnie przekształcenie jest wyśrodkowane na początku układu współrzędnych obiektu docelowego: (0,0). Jedynym wyjątkiem jest TranslateTransform; TranslateTransform nie ma właściwości środka do ustawienia, ponieważ efekt tłumaczenia jest taki sam, niezależnie od tego, gdzie jest wyśrodkowany.
W poniższym przykładzie użyto argumentu RotateTransformRectangle , aby obrócić element , typ o 45 stopni względem jego domyślnego FrameworkElementśrodka (0, 0, 0). Na poniższej ilustracji przedstawiono efekt rotacji.
Element prostokąta obrócony o 45 stopni o punkcie (0,0)
<Canvas Width="200" Height="200">
<Rectangle
Canvas.Left="100" Canvas.Top="100"
Width="50" Height="50"
Fill="RoyalBlue" Opacity="1.0">
<Rectangle.RenderTransform>
<RotateTransform Angle="45" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
Domyślnie element obraca się wokół lewego górnego rogu (0, 0). Klasy RotateTransform, ScaleTransformi SkewTransform zapewniają właściwości CenterX i CenterY, które umożliwiają określenie punktu, w którym jest stosowana transformacja.
W następnym przykładzie użyto również elementu RotateTransform , aby obrócić Rectangle element o 45 stopni, jednak tym razem CenterX właściwości i CenterY są ustawione tak, aby obiekt RotateTransform miał środek (25, 25). Na poniższej ilustracji przedstawiono efekt rotacji.
Element prostokąta obrócony o 45 stopni o punkcie (25, 25)
<Canvas Width="200" Height="200">
<Rectangle
Canvas.Left="100" Canvas.Top="100"
Width="50" Height="50"
Fill="RoyalBlue" Opacity="1.0">
<Rectangle.RenderTransform>
<RotateTransform Angle="45" CenterX="25" CenterY="25" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
Przekształcanie elementu FrameworkElement
Aby zastosować przekształcenia do klasy FrameworkElement, utwórz Transform element i zastosuj go do jednej z dwóch właściwości zapewnianych przez klasę FrameworkElement :
LayoutTransform — przekształcenie stosowane przed przekazaniem układu. Po zastosowaniu przekształcenia system układu przetwarza przekształcony rozmiar i położenie elementu.
RenderTransform — przekształcenie, które modyfikuje wygląd elementu, ale jest stosowane po zakończeniu przekazywania układu. Korzystając z RenderTransform właściwości zamiast LayoutTransform właściwości, można uzyskać korzyści z wydajności.
Której właściwości należy użyć? Ze względu na korzyści z wydajności, które zapewnia, należy używać RenderTransform właściwości zawsze, gdy jest to możliwe, zwłaszcza w przypadku korzystania z animowanych Transform obiektów. LayoutTransform Użyj właściwości podczas skalowania, obracania lub niesymetryczności, a element nadrzędny elementu jest potrzebny do dostosowania do przekształconego rozmiaru elementu. Należy pamiętać, że gdy są one używane z właściwością LayoutTransform , TranslateTransform obiekty wydają się nie mieć wpływu na elementy. Wynika to z faktu, że system układu zwraca przetłumaczony element do oryginalnej pozycji w ramach przetwarzania.
Aby uzyskać dodatkowe informacje o układzie w programie Windows Presentation Foundation (WPF), zobacz Omówienie układu .
Przykład: obracanie elementu FrameworkElement 45 stopni
W poniższym przykładzie użyto obiektu , RotateTransform aby obrócić przycisk zgodnie z ruchem wskazówek zegara o 45 stopni. Przycisk znajduje się w obiekcie StackPanel , który ma dwa inne przyciski.
Domyślnie RotateTransform obraca się o punkcie (0, 0). Ponieważ w przykładzie nie określono wartości środkowej, przycisk obraca się o punkcie (0, 0), który jest jego lewym górnym rogu. Właściwość RotateTransform jest stosowana do RenderTransform właściwości . Poniższa ilustracja przedstawia wynik przekształcenia.
Obrót zgodnie z ruchem wskazówek zegara 45 stopni od lewego górnego rogu
<Border Margin="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
BorderBrush="Black" BorderThickness="1" >
<StackPanel Orientation="Vertical">
<Button Content="A Button" Opacity="1" />
<Button Content="Rotated Button">
<Button.RenderTransform>
<RotateTransform Angle="45" />
</Button.RenderTransform>
</Button>
<Button Content="A Button" Opacity="1" />
</StackPanel>
</Border>
W następnym przykładzie użyto również elementu , RotateTransform aby obrócić przycisk 45 stopni zgodnie z ruchem wskazówek zegara, ale również ustawia RenderTransformOrigin przycisk na (0,5, 0,5). Wartość RenderTransformOrigin właściwości jest względna względem rozmiaru przycisku. W rezultacie rotacja jest stosowana do środka przycisku zamiast lewego górnego rogu. Poniższa ilustracja przedstawia wynik przekształcenia.
Obrót zgodnie z ruchem wskazówek zegara 45 stopni wokół środka
<Border Margin="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
BorderBrush="Black" BorderThickness="1">
<StackPanel Orientation="Vertical">
<Button Content="A Button" Opacity="1" />
<Button Content="Rotated Button"
RenderTransformOrigin="0.5,0.5">
<Button.RenderTransform>
<RotateTransform Angle="45" />
</Button.RenderTransform>
</Button>
<Button Content="A Button" Opacity="1" />
</StackPanel>
</Border>
W poniższym przykładzie użyto LayoutTransform właściwości zamiast RenderTransform właściwości , aby obrócić przycisk. Powoduje to, że transformacja ma wpływ na układ przycisku, który wyzwala pełne przekazywanie przez system układu. W związku z tym przycisk jest obracany, a następnie zmienia położenie, ponieważ jego rozmiar uległ zmianie. Poniższa ilustracja przedstawia wynik przekształcenia.
LayoutTransform używany do obracania przycisku
<Border Margin="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
BorderBrush="Black" BorderThickness="1">
<StackPanel Orientation="Vertical">
<Button Content="A Button" Opacity="1" />
<Button Content="Rotated Button">
<Button.LayoutTransform>
<RotateTransform Angle="45" />
</Button.LayoutTransform>
</Button>
<Button Content="A Button" Opacity="1" />
</StackPanel>
</Border>
Animowanie przekształceń
Ponieważ dziedziczą z Animatable klasy, Transform klasy mogą być animowane. Aby animować obiekt Transform, zastosuj animację zgodnego typu do właściwości, którą chcesz animować.
W poniższym przykładzie użyto obiektu Storyboard i z elementem , DoubleAnimationRotateTransform aby utworzyć Button spin w miejscu po kliknięciu.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Button Animated RotateTransform Example"
Background="White" Margin="50">
<StackPanel>
<Button Content="A Button"
RenderTransformOrigin="0.5,0.5">
<Button.RenderTransform>
<RotateTransform x:Name="AnimatedRotateTransform" Angle="0" />
</Button.RenderTransform>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="AnimatedRotateTransform"
Storyboard.TargetProperty="Angle"
To="360" Duration="0:0:1" FillBehavior="Stop" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Page>
Aby zapoznać się z kompletnym przykładem, zobacz Przykład przekształcenia 2D. Aby uzyskać więcej informacji na temat animacji, zobacz Omówienie animacji.
Funkcje zamrażalne
Ponieważ dziedziczy ona z Freezable klasy, Transform klasa zapewnia kilka specjalnych funkcji: Transform obiekty można zadeklarować jako zasoby, współdzielone między wieloma obiektami, wykonane tylko do odczytu w celu zwiększenia wydajności, sklonowania i zapewnienia bezpieczeństwa wątków. Aby uzyskać więcej informacji na temat różnych funkcji udostępnianych przez Freezable obiekty, zobacz Omówienie obiektów z możliwością zamrażania.
Zobacz też
.NET Desktop feedback