Язык программирования C#9 и платформа .NET5
</Ellipse.Fill></Ellipse><Ellipse HorizontalAlignment="Left" VerticalAlignment="Top"Height="101" Width="110" Stroke="Black"Canvas.Left="122" Canvas.Top="126"><Ellipse.Fill><LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"><GradientStop Color="#FFB91DDC" Offset="0.355"/><GradientStop Color="#FFB0381D" Offset="1"/></LinearGradientBrush></Ellipse.Fill></Ellipse></Canvas>Окончательная компоновка показана на рис. 26.10.
Применение трансформаций на этапе проектирования
Как упоминалось ранее, IDE-среда Visual Studio предоставляет встроенный редактор трансформаций, который можно найти в окне Properties. Раскройте раздел Transform (Трансформация), чтобы отобразить области RenderTransform и LayoutTransform редактора (рис. 26.11).
Подобно разделу Brush раздел Transform предлагает несколько вкладок, предназначенных для конфигурирования разнообразных типов графической трансформации текущего выбранного элемента. В табл. 26.6 описаны варианты трансформации, доступные на этих вкладках (в порядке слева направо).
Испытайте каждую из описанных трансформаций,используя в качестве цели специальную фигуру (для отмены выполненной операции просто нажимайте <Ctrl+Z>). Как и многие другие аспекты раздела Transform окна Properties, каждая трансформация имеет уникальный набор параметров конфигурации, которые должны стать вполне понятными, как только вы просмотрите их. Например, редактор трансформации Skew позволяет устанавливать значения скоса х и у, а редактор трансформации Flip дает возможность зеркально отображать относительно оси х или у и т.д.
Трансформация холста в коде
Реализации обработчиков для всех кнопок будут более или менее похожими. Мы сконфигурируем объект трансформации и присвоим его объекту
. Затем после запуска приложения можно будет щелкать на кнопке, чтобы просматривать результат применения трансформации. Ниже приведен полный код обработчиков (обратите внимание на установку свойстваmyCanvas, что позволяет фигурам позиционироваться относительно родительского контейнера):LayoutTransformprivate void Flip(object sender, System.Windows.RoutedEventArgs e){myCanvas.LayoutTransform = new ScaleTransform(-1, 1);}private void Rotate(object sender, System.Windows.RoutedEventArgs e){myCanvas.LayoutTransform = new RotateTransform(180);}private void Skew(object sender, System.Windows.RoutedEventArgs e){myCanvas.LayoutTransform = new SkewTransform(40, -20);}Визуализация графических данных с использованием рисунков и геометрических объектов
Несмотря на то что типы
позволяют генерировать интерактивную двумерную поверхность любого вида, из-за насыщенной цепочки наследования они потребляют довольно много памяти. И хотя классShapeможет помочь снизить накладные расходы за счет применения включенных геометрических объектов (вместо крупной коллекции других фигур), инфраструктура WPF предоставляет развитый API-интерфейс рисования и геометрии, который визуализирует еще более легковесные двумерные векторные изображения.PathВходной точкой в этот API-интерфейс является абстрактный класс
(из сборкиSystem.Windows.Media.Drawing), который сам по себе всего лишь определяет ограничивающий прямоугольник для хранения результатов визуализации.PresentationCore.dllИнфраструктура WPF предлагает разнообразные классы, расширяющие
, каждый из которых представляет отдельный способ рисования содержимого (табл. 26.7).DrawingБудучи более легковесными, производные от
типы не обладают встроенной возможностью обработки событий, т.к. они не являютсяDrawingилиUIElement(хотя допускают программную реализацию логики проверки попадания).FrameworkElementДругое ключевое отличие между типами, производными от
, и типами, производными отDrawing, состоит в том, что производные отShapeтипы не умеют визуализировать себя, поскольку не унаследованы отDrawing! Для отображения содержимого производные типы должны помещаться в какой-то контейнерный объект (в частностиUIElement,DrawingImageилиDrawingBrush).DrawingVisualКласс
позволяет помещать рисунки и геометрические объекты внутрь элемента управления Image из WPF, который обычно применяется для отображения данных из внешнего файла. КлассDrawingImageдает возможность строить кисть на основе рисунков и геометрических объектов, которая предназначена для установки свойства, требующего кисть. Наконец, классDrawingBrushиспользуется только на "визуальном" уровне графической визуализации, полностью управляемом из кода С#.DrawingVisualХотя работать с рисунками немного сложнее, чем с простыми фигурами, отделение графической композиции от графической визуализации делает типы, производные от
, гораздо более легковесными, чем производные отDrawingтипы, одновременно сохраняя их ключевые службы.Shape



