Главная » WPF » Преобразования WPF

0

Когда все прочие средства исчерпаны, остается кувалда. Для установки  оконча# тельного положения элемента  существуют  два свойства, позволяющие выполнить произвольное геометрическое преобразование: RenderTransform и LayoutTransform.

public class FrameworkElement : UIElement {

public Transform LayoutTransform { get; set; }

public Transform RenderTransform { get; set; }

// другие члены FrameworkElement …

}

Оба свойства  имеют тип System.Windows.Media.Transform, который  мы рас# смотрим в главе 5. А пока можно изучить его на примере наиболее употребитель# ных  подклассов:   ScaleTransform, RotateTransform, TranslateTransform и TransformGroup, Класс  ScaleTransform позволяет  выполнить растяжение или сжатие по оси x/y, RotateTransform – осуществлять поворот вокруг заданной точ# ки, а TranslateTransform – производить параллельный перенос на заданный  век# тор. Наконец, класс TransformGroup служит для произвольного комбинирования трех примитивных преобразований.

Единственное различие между RenderTransform и LayoutTransform заключает# ся в том, когда применяется преобразование. Преобразования, хранящиеся в свой# стве RenderTransform, применяются непосредственно перед выводом на экран7 (и, значит, затрагивают  только вывод), а те, что хранятся в LayoutTransform, – перед размещением  (и, следовательно, сказываются и на размещении компонента). Чтобы понять, как эти два свойства  взаимодействуют, начнем с простой  панели StackPanel, содержащей  три кнопки (рис. 4.4):

<StackPanel Background=’…’ Orientation=’Horizontal’>

<Button Width=’75’>

15

</Button>

<Button Width=’75’>

45

</Button>

<Button Width=’75’>

65

</Button>

</StackPanel>

Чтобы  повернуть  каждую  кнопку  на определенный угол, можно  воспользо# ваться свойством RenderTransform, LayoutTransform или обоими. Если добавить преобразование RotateTransform в свойство  RenderTransform для каждой  кноп# ки, получится результат, изображенный на рис. 4.5:

<StackPanel Background=’…’ Orientation=’Horizontal’>

<Button Width=’75’>

<Button.RenderTransform>

<RotateTransform Angle=’15’ />

</Button.RenderTransform>

15

</Button>

<Button Width=’75’>

<Button.RenderTransform>

Рис. 4.5. Задание свойства RenderTransform для каждой кнопки

Рис. 4.6. Задание свойства LayoutTransform для каждой кнопки

<StackPanel Background=’…’ Orientation=’Horizontal’>

<Button Width=’75’>

<Button.LayoutTransform>

<RotateTransform Angle=’15’ />

</Button.LayoutTransform>

15

</Button>

<Button Width=’75’>

<Button.LayoutTransform>

<RotateTransform Angle=’45’ />

</Button.LayoutTransform>

45

</Button>

<Button Width=’75’>

<Button.LayoutTransform>

<RotateTransform Angle=’65’ />

</Button.LayoutTransform>

65

</Button>

</StackPanel>

Теперь кнопки не перекрываются, а размер панели изменился так, что они по# мещаются в ней целиком. Поскольку хранящиеся в свойстве LayoutTransform пре# образования применяются до размещения, то система знает о том, к чему они при# вели. В общем случае, для получения визуальных эффектов (например, анимации при входе) лучше пользоваться свойством RenderTransform. Так как преобразова# ния, применяемые при выводе  на экран, не затрагивают  размещения, их можно выполнять целиком в видеокарте, избежав вычислений при создании эффекта.

Источник: К. Андерсон  Основы  Windows Presentation Foundation. Пер. с англ. А. Слинкина — М.: ДМК Пресс, 2008 — 432 с.: ил.

По теме:

  • Комментарии