Язык программирования C#9 и платформа .NET5
Часть 525 из 642 Информация о книге
<b> установленный в свойстве Data --></b><Path Fill = "Orange" Stroke = "Blue" StrokeThickness = "3"><Path.Data><GeometryGroup><EllipseGeometry Center = "75,70" RadiusX = "30" RadiusY = "30" /><RectangleGeometry Rect = "25,55 100 30" /><LineGeometry StartPoint="0,0" EndPoint="70,30" /><LineGeometry StartPoint="70,30" EndPoint="0,30" /></GeometryGroup></Path.Data></Path>Изображение на рис. 26.3 может быть визуализировано с применением показанных ранее классов
,LineиEllipse. Однако это потребовало бы помещения различных объектовRectangleв память. Когда для моделирования точек рисуемого изображения используются геометрические объекты, а затем коллекция геометрических объектов помещается в контейнер, который способен визуализировать данные (UIElementв рассматриваемом случае), то тем самым сокращается расход памяти.PathТеперь вспомните, что класс
имеет ту же цепочку наследования, что и любой член пространства именPath, а потому обладает возможностью отправлять такие же уведомления о событиях, как другие объектыSystem.Windows.Shapes. Следовательно, если определить тот же самый элементUIElementв проекте Visual Studio, тогда выяснить, что пользователь щелкнул в любом месте линии, можно будет за счет обработки события мыши (не забывайте, что редактор Kaxaml не разрешает обрабатывать события для написанной разметки).<Path>"Мини-язык" моделирования путей
Из всех классов, перечисленных в табл. 26.3, класс
наиболее сложен для конфигурирования в терминах XAML и кода. Причина объясняется тем фактом, что каждый сегментPathGeometryсостоит из объектов, содержащих разнообразные сегменты и фигуры (скажем,PathGeometry,ArcSegment,BezierSegment,LineSegment,PolyBezierSegment,PolyLineSegmentи т.д.). Вот пример объектаPolyQuadraticBezierSegment, свойствоPathкоторого было установлено в элементData, состоящий из различных фигур и сегментов:PathGeometry<Path Stroke="Black" StrokeThickness="1" ><Path.Data><PathGeometry><PathGeometry.Figures><PathFigure StartPoint="10,50"><PathFigure.Segments><BezierSegmentPoint1="100,0"Point2="200,200"Point3="300,100"/><LineSegment Point="400,100" /><ArcSegmentSize="50,50" RotationAngle="45"IsLargeArc="True" SweepDirection="Clockwise"Point="200,100"/></PathFigure.Segments></PathFigure></PathGeometry.Figures></PathGeometry></Path.Data></Path>По правде говоря, лишь немногим программистам придется когда-либо вручную строить сложные двумерные изображения, напрямую описывая объекты производных от
илиGeometryклассов. Позже в главе вы узнаете, как преобразовывать векторную графику в операторы "мини-языка" моделирования путей, которые можно применять в разметке XAML.PathSegmentДаже с учетом содействия со стороны упомянутых ранее инструментов объем разметки XAML, требуемой для определения сложных объектов
, может быть устрашающе большим, т.к. данные состоят из полных описаний различных объектов классов, производных отPathилиGeometry. Для того чтобы создавать более лаконичную разметку, в классеPathSegmentподдерживается специализированный "мини-язык".PathНапример, вместо установки свойства
объектаDataв коллекцию объектов классов, производных отPathиGeometry, его можно установить в одиночный строковый литерал, содержащий набор известных символов и различных значений, которые определяют фигуру, подлежащую визуализации. Ниже приведен простой пример, а его результирующий вывод показан на рис. 26.4:PathSegment<Path Stroke="Black" StrokeThickness="3"Data="M 10,75 C 70,15 250,270 300,175 H 240" />Команда
(от move — переместить) принимает координаты (М,х) позиции, которая представляет начальную точку рисования. Командау(от curve — кривая) принимает последовательность точек для визуализации кривой (точнее кубической кривой Безье), а командаС(от horizontal — горизонталь) рисует горизонтальную линию.Н

