Přehled transformace
Toto téma popisuje, jak pomocí 2D Transform tříd otáčet, škálovat, přesouvat (překládat) a zkosit FrameworkElement objekty.
Co je transformace?
A Transform definuje, jak mapovat nebo transformovat body z jednoho souřadnicového prostoru do jiného souřadnicového prostoru. Toto mapování je popsáno transformací Matrix, což je kolekce tří řádků se třemi sloupci Double hodnot.
Poznámka:
Windows Presentation Foundation (WPF) používá matice hlavní řady. Vektory jsou vyjádřeny jako vektory řádků, nikoli vektory sloupců.
Následující tabulka ukazuje strukturu matice WPF.
2D transformační matice
Osy x | Osy y | Affinová transformace |
---|---|---|
M11 Výchozí hodnota: 1.0 |
M12 Výchozí hodnota: 0.0 |
0,0 |
M21 Výchozí hodnota: 0.0 |
M22 Výchozí hodnota: 1.0 |
0,0 |
OffsetX Výchozí hodnota: 0.0 |
OffsetY Výchozí hodnota: 0.0 |
1.0 |
Pomocí manipulace s hodnotami matice můžete objekt otočit, škálovat, zkosit, zkosit a přesunout (přeložit). Pokud například změníte hodnotu v prvním sloupci třetího řádku ( OffsetX hodnota) na 100, můžete ji použít k přesunutí objektu 100 jednotek podél osy x. Pokud změníte hodnotu ve druhém sloupci druhého řádku na 3, můžete ho použít k roztažení objektu na trojnásobek jeho aktuální výšky. Pokud změníte obě hodnoty, přesunete objekt o 100 jednotek podél osy x a roztáhnete jeho výšku faktorem 3. Protože Windows Presentation Foundation (WPF) podporuje pouze affine transformace, hodnoty v pravém sloupci jsou vždy 0, 0, 1.
I když Windows Presentation Foundation (WPF) umožňuje přímo manipulovat s maticovými hodnotami, poskytuje také několik Transform tříd, které umožňují transformovat objekt bez znalosti konfigurace základní maticové struktury. Třída například ScaleTransform umožňuje škálovat objekt nastavením jeho ScaleX a ScaleY vlastností místo manipulace s transformační maticí. Stejně tak RotateTransform třída umožňuje otočit objekt pouhým nastavením jeho Angle vlastnosti.
Třídy transformace
Windows Presentation Foundation (WPF) poskytuje následující 2D Transform třídy pro běžné transformační operace:
Třída | Popis | Příklad | Ilustrace |
---|---|---|---|
RotateTransform | Otočí prvek zadaným Angleobjektem . | Otočení objektu | |
ScaleTransform | Škáluje prvek podle zadaných ScaleX a ScaleY částek. | Změna velikosti elementu | |
SkewTransform | Zkosí prvek podle zadaných AngleX a AngleY částek. | Zkosení elementu | |
TranslateTransform | Přesune (překládá) prvek podle zadaných X a Y částek. | Překlad elementu |
Pro vytváření složitějších transformací poskytuje Windows Presentation Foundation (WPF) následující dvě třídy:
Třída | Popis | Příklad |
---|---|---|
TransformGroup | Seskupí více TransformGroup objektů do jednoho Transform objektu, který pak můžete použít k transformaci vlastností. | Použití několika transformací na objekt |
MatrixTransform | Vytvoří vlastní transformace, které nejsou poskytovány jinými Transform třídami. Když použijete matici MatrixTransform, manipulujete s maticí přímo. | Vytvoření vlastních transformací pomocí MatrixTransform |
Windows Presentation Foundation (WPF) také poskytuje 3D transformace. Další informace najdete v předmětu Transform3D .
Běžné vlastnosti transformace
Jedním ze způsobů, jak transformovat objekt, je deklarovat příslušný Transform typ a použít ho na transformační vlastnost objektu. Různé typy objektů mají různé typy transformačních vlastností. Následující tabulka uvádí několik běžně používaných typů WPF (Windows Presentation Foundation) a jejich transformačních vlastností.
Type | Vlastnosti transformace |
---|---|
Brush | Transform, RelativeTransform |
ContainerVisual | Transform |
DrawingGroup | Transform |
FrameworkElement | RenderTransform, LayoutTransform |
Geometry | Transform |
TextEffect | Transform |
UIElement | RenderTransform |
Transformace a souřadnicové systémy
Při transformaci objektu neproveďte pouze transformaci objektu, transformujete souřadnicový prostor, ve kterém tento objekt existuje. Ve výchozím nastavení je transformace na střed na počátku souřadnicového systému cílového objektu: (0,0). Jedinou výjimkou je TranslateTransform, TranslateTransform že nemá žádné vlastnosti středu, které se mají nastavit, protože efekt překladu je stejný bez ohledu na to, kde je zacentrován.
Následující příklad používá RotateTransform k otočení Rectangle prvku, typ FrameworkElement, o 45 stupňů o jeho výchozí střed , (0, 0). Následující obrázek znázorňuje efekt otočení.
Obdélníkový prvek otočený o 45 stupňů o bodu (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>
Ve výchozím nastavení se prvek otočí o levý horní roh (0, 0). Třídy RotateTransforma SkewTransform objekty ScaleTransformposkytují vlastnosti CenterX a CenterY, které umožňují určit bod, ve kterém se transformace použije.
Další příklad také používá RotateTransform k otočení Rectangle prvku o 45 stupňů; tentokrát CenterX jsou však nastaveny vlastnosti CenterY tak, aby RotateTransform byl střed (25, 25). Následující obrázek znázorňuje efekt otočení.
Obdélníkový prvek otočený o bod o 45 stupňů (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>
Transformace FrameworkElement
Pokud chcete použít transformace na objekt FrameworkElement, vytvořte Transform a použijte ho na jednu ze dvou vlastností, které FrameworkElement třída poskytuje:
LayoutTransform – Transformace, která se použije před předáním rozložení. Po použití transformace systém rozložení zpracuje transformovanou velikost a pozici prvku.
RenderTransform – Transformace, která upraví vzhled prvku, ale použije se po dokončení průchodu rozložení. RenderTransform Pomocí vlastnosti místo vlastnosti můžete získat výhody výkonuLayoutTransform.
Kterou vlastnost byste měli použít? Vzhledem k výhodám výkonu, které poskytuje, použijte RenderTransform vlastnost, kdykoli je to možné, zejména při použití animovaných Transform objektů. LayoutTransform Vlastnost použijte při škálování, otáčení nebo skewing a potřebujete nadřazený prvek upravit na transformovanou velikost prvku. Všimněte si, že když jsou použity s LayoutTransform vlastností, TranslateTransform objekty se zdá, že nemají žádný vliv na prvky. Důvodem je to, že systém rozložení vrátí přeložený prvek do původní pozice v rámci zpracování.
Další informace o rozložení ve Windows Presentation Foundation (WPF) naleznete v tématu Přehled rozložení .
Příklad: Otočení FrameworkElement o 45 stupňů
Následující příklad používá RotateTransform k otočení tlačítka po směru hodinových ručiček o 45 stupňů. Tlačítko je obsaženo ve StackPanel dvou dalších tlačítkách.
Ve výchozím nastavení RotateTransform se otočí o bod (0, 0). Vzhledem k tomu, že v příkladu není zadaná středová hodnota, tlačítko otočí o bod (0, 0), což je jeho levý horní roh. Použije se RotateTransform na RenderTransform vlastnost. Následující obrázek znázorňuje výsledek transformace.
Otočení po směru hodinových ručiček o 45 stupňů od levého horního rohu
<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>
Další příklad také používá RotateTransform k otočení tlačítka o 45 stupňů ve směru hodinových ručiček, ale také nastaví RenderTransformOrigin tlačítko na (0,5, 0,5). Hodnota RenderTransformOrigin vlastnosti je relativní vzhledem k velikosti tlačítka. V důsledku toho se otočení použije na střed tlačítka místo jeho levého horního rohu. Následující obrázek znázorňuje výsledek transformace.
Otočení po směru hodinových ručiček kolem středu
<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>
Následující příklad používá LayoutTransform vlastnost místo RenderTransform vlastnosti k otočení tlačítka. To způsobí, že transformace ovlivní rozložení tlačítka, které aktivuje úplné předání systémem rozložení. V důsledku toho se tlačítko otočí a pak přemístí, protože se změnila jeho velikost. Následující obrázek znázorňuje výsledek transformace.
LayoutTransform použitý k otočení tlačítka
<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>
Animace transformací
Vzhledem k tomu, že dědí z Animatable třídy, Transform mohou být třídy animované. Pokud chcete animovat , použijte animaci Transformkompatibilního typu na vlastnost, kterou chcete animovat.
Následující příklad používá a Storyboard s DoubleAnimation a s RotateTransform k vytvoření Button rotace na místě při kliknutí.
<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>
Kompletní ukázku najdete v části Ukázka 2D transformací. Další informace o animacích najdete v přehledu animací.
Zamrznutelné funkce
Vzhledem k tomu, že dědí z Freezable třídy, Transform třída poskytuje několik speciálních funkcí: Transform objekty lze deklarovat jako prostředky sdílené mezi více objekty, aby se zlepšil výkon, klonovaný a vytvořený přístup z více vláken. Další informace o různých funkcích, které jsou poskytovány Freezable objekty, naleznete v přehledu Zamrznutelné objekty.
Viz také
.NET Desktop feedback