Трансформации

29

Огромный объем задач, связанных с рисованием, может быть упрощен благодаря применению трансформации (transform) — объекта, изменяющего способ рисования фигуры или элемента посредством скрытого сдвига используемой им координатной системы. В WPF трансформации представлены классами, унаследованными от абстрактного класса System.Windows.Media.Transform, которые перечислены в таблице:

Классы трансформаций WPF
Имя Описание Важные свойства
TranslateTransform Смещает координатную систему на определенную величину. Эта трансформация удобна, когда нужно нарисовать ту же самую фигуру в разных местах X,Y
RotateTransform Поворачивает координатную систему. Нормально нарисованные фигуры поворачиваются вокруг заданной точки Angle, CenterX, CenterY
ScaleTransform Масштабирует координатную систему в большую и меньшую сторону, так что фигуры становятся больше или меньше. По измерениям X и Y можно применять разную степень масштабирования, в результате растягивая или сжимая фигуру ScaleX, ScaleY, CenterX, CenterY
SkewTransform Деформирует координатную систему, наклоняя ее на определенное число градусов. Например, нарисованный квадрат после трансформации превращается в параллелограмм AngleX, AngleY, CenterX, CenterY
MatrixTransform Модифицирует координатную систему, используя матричное умножение с указанной матрицей. Это наиболее сложная трансформация — она требует определенной математической подготовки Matrix
TransformGroup Комбинирует несколько трансформаций таким образом, что они могут применяться одновременно. Порядок применения трансформаций важен — он влияет на конечный результат. Например, вращение фигуры (с помощью RotateTransform) с последующим перемещением ее (посредством TranslateTransform) переместит фигуру в другое место, отличное от того, которое было бы в случае сначала перемещения фигуры, а потом ее поворота -

Формально все трансформации используют математические операции над матрицами для изменения координат фигуры. Однако применение предварительно построенных трансформаций — таких как TranslateTransform, RotateTransform, ScaleTransform и SkewTransform — проще, нежели использование MatrixTransform и попытки найти правильную матрицу для выполнения требуемой операции. В случае выполнения серии трансформаций с помощью TransformGroup среда WPF объединяет их вместе в единую трансформацию MatrixTransform, обеспечивая оптимальную производительность.

Все трансформации наследуются от Freezable (через класс Transform). Это значит, что они имеют автоматическую поддержку уведомлений об изменениях. В случае изменения трансформации, используемой фигурой, фигура немедленно перерисовывает себя.

Трансформации — одна из тех причудливых концепций, которые оказываются чрезвычайно полезными в широком разнообразии различных контекстов. Ниже приведено несколько примеров:

Наклон фигуры

До сих пор вы были привязаны к горизонтально выровненным прямоугольникам, эллипсам, линиям и многоугольникам. Используя RotateTransform, можно повернуть координатную систему для более удобного создания определенных фигур.

Повторение фигуры

Многие рисунки строятся на использовании похожих фигур в нескольких разных местах. Применяя трансформацию, можно взять фигуру и переместить ее, повернуть, изменить ее размер и т.д.

Для того чтобы использовать одну и ту же фигуру во многих местах, нужно дублировать ее в коде разметки (что далеко не идеально), использовать код (чтобы создавать фигуры программно) или применять фигуру Path. Фигура Path принимает объекты Geometry, а такой объект геометрии можно хранить в виде ресурса, так что его можно многократно использовать в коде разметки.

Анимация

С помощью динамических трансформаций, таких как поворот фигуры, перемещение ее из одного места в другое и искажение, можно создавать множество сложных эффектов.

Пройди тесты
Лучший чат для C# программистов