Общие сведения о классах Transform
Обновлен: Ноябрь 2007
В этом разделе описывается использование класса двухмерныйTransform для поворота, масштабирования, сдвига и наклона объектов FrameworkElement.
В этом разделе содержатся следующие подразделы.
- Что такое Transform
- Классы Transform
- Общие свойства преобразований
- Системы координат и преобразования
- Преобразование FrameworkElement
- Пример: Поворот элемента FrameworkElement на 45 градусов
- Анимируемые преобразования
- Возможности объектов Freezable
- Связанные разделы
Что такое Transform
Transform определяет способ сопоставления или преобразования точек из одного координатного пространства в другое. Это сопоставление описано преобразованием Matrix, которое представляет собой коллекцию из трех строк с тремя столбцами, содержащую значения типа Double.
Примечание. |
---|
Как и Microsoft, WPF (Windows Presentation Foundation) использует матрицы, основанные на строках. Векторы представляют собой строки, а не столбцы. |
В следующей таблице показана структура матрицы WPF.
Матрица двумерного преобразования
Значение по умолчанию: 1,0 |
Значение по умолчанию: 0,0 |
0,0 |
Значение по умолчанию: 0,0 |
Значение по умолчанию: 1,0 |
0,0 |
Значение по умолчанию: 0,0 |
Значение по умолчанию: 0,0 |
1,0 |
Управляя значениями матрицы, можно поворачивать, масштабировать, наклонять и перемещать объект. Например, изменив значения в первом столбце третьей строки (значение OffsetX) на 100, можно переместить объект на 100 единиц вдоль оси X. Изменив значение во втором столбце второй строки на 3, можно растянуть объект в высоту в три раза от текущего размера. Если изменить оба значения, объект переместится на 100 единиц вдоль оси X и растянется в высоту с коэффициентом 3. Поскольку WPF (Windows Presentation Foundation) поддерживает только аффинные преобразования, значения в правом столбце всегда остаются равными 0, 0, 1.
Не смотря на то, что WPF (Windows Presentation Foundation) дает возможность непосредственно управлять значениями матрицы, она также предоставляет несколько классов Transform, позволяющих преобразовывать объект, не зная структуры матрицы. Например, класс ScaleTransform позволяет масштабировать объект с помощью определения его свойств ScaleX и ScaleY вместо управления матрицей преобразования. Аналогично класс RotateTransform позволяет повернуть объект, просто задав его свойство Angle.
Классы Transform
WPF (Windows Presentation Foundation) предоставляет следующие классы двухмерныйTransform для общих операций преобразования:
Класс |
Описание |
Пример |
Иллюстрация |
---|---|---|---|
Поворачивает элемент на значение, заданное в Angle. |
|||
Масштабирует элемент, используя коэффициенты, заданные в ScaleX и ScaleY. |
|||
Наклоняет элемент на коэффициенты, заданные в AngleX и AngleY. |
|||
Для совершения более сложных преобразований WPF (Windows Presentation Foundation) предоставляет следующие два класса:
Класс |
Описание |
Пример |
---|---|---|
Группирует несколько объектов TransformGroup в один объект Transform, к которому затем можно применять преобразования свойств. |
Практическое руководство. Применение нескольких преобразований к объекту |
|
Создает настраиваемые преобразования, не предоставленные другими классами Transform. При использовании MatrixTransform происходит непосредственное управление матрицей. |
WPF (Windows Presentation Foundation) также предоставляет возможность трехмерный преобразований. Дополнительные сведения см. в описании класса Transform3D.
Общие свойства преобразований
Одним из способов преобразования объекта является объявление соответствующего типа Transform и применение его к свойству преобразования объекта. Для различных типов объектов существуют различные типы свойств преобразования. В следующей таблице перечислены несколько часто используемых типов WPF (Windows Presentation Foundation) и их свойства преобразования.
Тип |
Свойства преобразования |
---|---|
Системы координат и преобразования
При преобразовании объекта происходит не просто его преобразование, а преобразование пространства координат, в котором существует объект. По умолчанию преобразование центрируется в начале координат целевого объекта (0,0). Единственным исключением является TranslateTransform; TranslateTransform не имеет свойства центра, так как результат смещения не зависит от выбора центра смещения.
В следующем примере RotateTransform используется для поворота элемента Rectangle типа FrameworkElement на 45 градусов относительно его центра по умолчанию, (0, 0). На следующей иллюстрации приведен результат поворота.
Прямоугольный элемент, повернутый на 45 градусов относительно точки (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>
По умолчанию элемент поворачивается относительно своего левого верхнего угла, (0, 0). Классы RotateTransform, ScaleTransform и SkewTransform предоставляют свойства CenterX и CenterY, позволяющие задать точку, относительно которой применяется преобразование.
В следующем примере также используется RotateTransform для поворота элемента Rectangle на 45 градусов; однако, в этом случае свойства CenterX и CenterY заданы так, что центр RotateTransform (25, 25). На следующей иллюстрации приведен результат поворота.
Прямоугольный элемент, повернутый на 45 градусов относительно точки (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>
Преобразование FrameworkElement
Чтобы применить преобразования к FrameworkElement, создайте Transform и примените его к одному из двух свойств, предоставленных классом FrameworkElement:
LayoutTransform – преобразование, применяемое перед проходом разметки. После применения преобразования система макета обрабатывает преобразованные размер и положение элемента.
RenderTransform – преобразование, которое изменяет положение элемента, но применяется после завершения прохода разметки. Используя свойства RenderTransform вместо свойства LayoutTransform, можно увеличить производительность системы.
Какое свойство следует использовать? Ввиду предоставляемого повышения производительности используйте свойство RenderTransform везде, где это возможно, особенно при использовании анимированных объектов Transform. При масштабировании, повороте или наклоне применяется свойство LayoutTransform. Также требуется, чтобы родитель изменяемого элемента изменил свой размер в соответствии с изменениями своего дочернего элемента. Обратите внимание, что при использовании совместно со свойством LayoutTransform объекты TranslateTransform не вызывают видимых изменений в элементах. Это происходит потому, что, в ходе преобразования, система макета возвращает преобразуемый элемент на его исходную позицию.
Дополнительные сведения о макетах Windows Presentation Foundation (WPF) см. в разделе общих сведений Система макета.
Пример: Поворот элемента FrameworkElement на 45 градусов
В следующем примере для поворота кнопки по часовой стрелке на 45 градусов используется RotateTransform. Кнопка располагается в StackPanel, имеющей еще 2 кнопки.
По умолчанию RotateTransform поворачивается относительно точки (0, 0). Поскольку в примере не задано значение для центра, кнопка поворачивается относительно точки (0, 0), то есть верхнего левого угла. RotateTransform применяется к свойству RenderTransform. На следующей иллюстрации показан результат выполнения преобразования.
Поворот по часовой стрелке на 45 градусов относительно левого верхнего угла
<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>
В следующем примере также используется RotateTransform для поворота кнопки на 45 градусов по часовой стрелке, а также для RenderTransformOrigin кнопки задается значение (0,5, 0,5). Значение свойства RenderTransformOrigin зависит от размера кнопки. В результате, поворот выполняется относительно центра кнопки, а не ее верхнего левого угла. На следующей иллюстрации показан результат выполнения преобразования.
Поворот по часовой стрелке на 45 градусов относительно центра
<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>
В следующем примере для поворота кнопки используется свойство LayoutTransform вместо свойства RenderTransform. При этом преобразование влияет на макет кнопки, что запускает полный проход системы макета. В результате кнопка повернута и ее расположение изменено, поскольку изменился ее размер. На следующей иллюстрации показан результат выполнения преобразования.
Для поворота кнопки использовалось свойство LayoutTransform
<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>
Анимируемые преобразования
Поскольку происходит наследование от класса Animatable, классы Transform должны быть анимированными. Чтобы анимировать Transform, примените анимацию совместимого типа к требуемому свойству.
В следующем примере используется Storyboard и DoubleAnimation с RotateTransform, чтобы заставить Button вращаться при нажатии.
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://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>
Полный пример содержится в разделе Пример двумерных преобразований. Дополнительные сведения об анимации см. в разделе Общие сведения об эффектах анимации.
Возможности объектов Freezable
Поскольку класс наследуется от класса Freezable, класс Transform имеет несколько особенных возможностей: объекты класса Transform можно объявлять ресурсами, которые: могут совместно использоваться несколькими объектами; их можно сделать доступными только для чтения с целью улучшения производительности, клонирования для того, чтобы сделать их потокобезопасными. Дополнительные сведения о различных возможностях, предоставляемых объектами Freezable, см. в разделе Общие сведения об объектах класса Freezable.
См. также
Задачи
Пример двумерных преобразований