Язык программирования C#9 и платформа .NET5
Часть 524 из 642 Информация о книге
На заметку! По умолчанию метод
возвращает объектVisualTreeHelper.HitTest()самого верхнего уровня, на котором совершен щелчок, и не предоставляет информацию о других объектах, расположенных под ним (т.е. перекрытых в Z-порядке).UIElementВ результате внесенных модификаций должна появиться возможность добавления фигуры на
щелчком левой кнопкой мыши и ее удаления щелчком правой кнопкой мыши.CanvasДо настоящего момента вы применяли объекты типов, производных от
, для визуализации содержимого элементовShapeс использованием разметки XAML и заполнялиRadioButtonв коде С#. Во время исследования роли кистей и графических трансформаций в данный пример будет добавлена дополнительная функциональность. К слову, в другом примере главы будут иллюстрироваться приемы перетаскивания на объектахCanvas. А пока давайте рассмотрим оставшиеся члены пространства именUIElement.System.Windows.ShapesРабота с элементами Polyline и Polygon
В текущем примере используются только три класса, производных от
. Остальные дочерние классы (Shape,PolylineиPolygon) чрезвычайно трудно корректно визуализировать без инструментальной поддержки (такой как инструмент Blend для Visual Studio или другие инструменты, которые могут создавать векторную графику) — просто потому, что они требуют определения большого количества точек для своего выходного представления. Ниже представлен краткий обзор остальных типовPath.ShapesТип
позволяет определить коллекцию координат (Polyline,х) (через свойствоу) для рисования последовательности линейных сегментов, не требующих замыкания. ТипPointsпохож, но запрограммирован так, что всегда замыкает контур, соединяя начальную точку с конечной, и заполняет внутреннюю область с помощью указанной кисти. Предположим, что в редакторе Kaxaml создан следующий элементPolygon:StackPanel<b><!-- Элемент Polyline не замыкает автоматически конечные точки --></b><Polyline Stroke ="Red" StrokeThickness ="20" StrokeLineJoin ="Round"Points ="10,10 40,4010,90 300,50"/><b><!-- Элемент Polygon всегда замыкает конечные точки --></b><Polygon Fill ="AliceBlue" StrokeThickness ="5" Stroke ="Green"Points ="40,10 70,80 10,50" />На рис. 26.2 показан визуализированный вывод в Kaxaml.
Работа с элементом Path
Применяя только типы
,Rectangle,Ellipse,PolygonиPolyline, нарисовать детализированное двумерное векторное изображение было бы исключительно трудно, т.к. упомянутые примитивы не позволяют легко фиксировать графические данные, подобные кривым, объединениям перекрывающихся данных и т.д. Последний производный отLineкласс,Shape, предоставляет возможность определения сложных двумерных графических данных в виде коллекции независимых геометрических объектов. После того, как коллекция таких геометрических объектов определена, ее можно присвоить свойствуPathклассаData, где она будет использоваться для визуализации сложного двумерного изображения.PathСвойство
получает объект класса, производного отData, который содержит ключевые члены, кратко описанные в табл. 26.2.System.Windows.Media.GeometryКлассы, которые расширяют класс
(табл. 26.3), выглядят очень похожими на свои аналоги, производные отGeometry. Например, классShapeимеет члены, подобные членам классаEllipseGeometry. Крупное отличие связано с тем, что производные отEllipseклассы не знают, каким образом визуализировать себя напрямую, поскольку они не являютсяGeometry. Взамен классы, производные отUIElement, представляют всего лишь коллекцию данных о точках, которая указывает объектуGeometry, как их визуализировать.PathНа заметку! Класс
не является единственным классом в инфраструктуре WPF, который способен работать с коллекцией геометрических объектов. Например, классыPath,DoubleAnimationUsingPath,DrawingGroupи дажеGeometryDrawingмогут использовать геометрические объекты для визуализации с применением свойствUIElement,PathGeometry,ClipGeometryиGeometryсоответственно.ClipВ показанной далее разметке для элемента
используется несколько типов, производных отPath. Обратите внимание, что свойствоGeometryобъектаDataустанавливается в объектPath, который содержит объекты других производных отGeometryGroupклассов, таких какGeometry,EllipseGeometryиRectangleGeometry. Результат представлен на рис.26.3.LineGeometry<b><!-- Элемент Path содержит набор объектов Geometry,</b>


