В результате внесенных модификаций должна появиться возможность добавления фигуры на Canvas
До настоящего момента вы применяли объекты типов, производных от Shape
RadioButton с использованием разметки XAML и заполняли Canvas в коде С#. Во время исследования роли кистей и графических трансформаций в данный пример будет добавлена дополнительная функциональность. К слову, в другом примере главы будут иллюстрироваться приемы перетаскивания на объектах UIElement. А пока давайте рассмотрим оставшиеся члены пространства имен System.Windows.Shapes.Работа с элементами Polyline и Polygon
В текущем примере используются только три класса, производных от Shape
Polyline, Polygon и Path) чрезвычайно трудно корректно визуализировать без инструментальной поддержки (такой как инструмент Blend для Visual Studio или другие инструменты, которые могут создавать векторную графику) — просто потому, что они требуют определения большого количества точек для своего выходного представления. Ниже представлен краткий обзор остальных типов Shapes.Тип Polyline
х, у) (через свойство Points) для рисования последовательности линейных сегментов, не требующих замыкания. Тип Polygon похож, но запрограммирован так, что всегда замыкает контур, соединяя начальную точку с конечной, и заполняет внутреннюю область с помощью указанной кисти. Предположим, что в редакторе Kaxaml создан следующий элемент StackPanel: Points ="10,10 40,40
10,90 300,50"/>
Points ="40,10 70,80 10,50" />
На рис. 26.2 показан визуализированный вывод в Kaxaml.
Работа с элементом Path
Применяя только типы Rectangle
Ellipse, Polygon, Polyline и Line, нарисовать детализированное двумерное векторное изображение было бы исключительно трудно, т.к. упомянутые примитивы не позволяют легко фиксировать графические данные, подобные кривым, объединениям перекрывающихся данных и т.д. Последний производный от Shape класс, Path, предоставляет возможность определения сложных двумерных графических данных в виде коллекции независимых Data класса Path, где она будет использоваться для визуализации сложного двумерного изображения.Свойство Data
System.Windows.Media.Geometry, который содержит ключевые члены, кратко описанные в табл. 26.2.Классы, которые расширяют класс Geometry
Shape. Например, класс EllipseGeometry имеет члены, подобные членам класса Ellipse. Крупное отличие связано с тем, что производные от Geometry классы не знают, каким образом визуализировать себя напрямую, поскольку они не являются UIElement. Взамен классы, производные от Geometry, представляют всего лишь коллекцию данных о точках, которая указывает объекту Path, как их визуализировать.На заметку!
КлассPath не является единственным классом в инфраструктуре WPF, который способен работать с коллекцией геометрических объектов. Например, классы DoubleAnimationUsingPath, DrawingGroup, GeometryDrawing и даже UIElement могут использовать геометрические объекты для визуализации с применением свойств PathGeometry, ClipGeometry, Geometry и Clip соответственно.В показанной далее разметке для элемента Path
Geometry. Обратите внимание, что свойство Data объекта Path устанавливается в объект GeometryGroup, который содержит объекты других производных от Geometry классов, таких как EllipseGeometry, RectangleGeometry и LineGeometry. Результат представлен на рис.26.3.
Изображение на рис. 26.3 может быть визуализировано с применением показанных ранее классов Line
Ellipse и Rectangle. Однако это потребовало бы помещения различных объектов UIElement в память. Когда для моделирования точек рисуемого изображения используются геометрические объекты, а затем коллекция геометрических объектов помещается в контейнер, который способен визуализировать данные (Path в рассматриваемом случае), то тем самым сокращается расход памяти.