Фигуры удобны для создания самых простейших рисунков, дизайна, однако что-то более сложное и комплексное с их помощью сделать труднее. Поэтому для этих целей применяется класс Path, который представляет геометрический путь. Он также, как и фигуры, наследуется от класса Shape, но может заключать в себе совокупность объединенных фигур. Класс Path имеет свойство Data, которое определяет объект Geometry - геометрический объект для отрисовки. Этот объект задает фигуру или совукупность фигур для отрисовки.
Класс Geometry - абстрактный, поэтому в качестве объекта используется один из производных классов:
LineGeometry представляет линию, эквивалент фигуры Line
RectangleGeometry представляет прямоугольник, эквивалент фигуры Rectangle
EllipseGeometry представляет эллипс, эквивалент фигуры Ellipse
PathGeometry представляет путь, образующий сложную геометрическую фигуру из простейших фигур
GeometryGroup создает фигуру, состоящую из нескольких объектов Geometry
CombinedGeometry создает фигуру, состоящую из двух объектов Geometry
StreamGeometry - специальный объект Geometry, предназначенный для сохранения всего геометрического пути в памяти
Например, использование LineGeometry:
<Path Stroke="Blue"> <Path.Data> <LineGeometry StartPoint="100,30" EndPoint="200,130" /> </Path.Data> </Path>
будет аналогично следующему объекту Line:
<Line X1="100" Y1="30" X2="200" Y2="130" Stroke="Blue" />
Свойства StartPoint
и EndPoint
задают начальную и конечную точки линии.
RectangleGeometry:
<StackPanel> <Path Fill="LightBlue"> <Path.Data> <RectangleGeometry Rect="100,20 100,50" /> </Path.Data> </Path> <Path Fill="LightPink"> <Path.Data> <RectangleGeometry Rect="100,20 100,50" RadiusX="10" RadiusY="10" /> </Path.Data> </Path> </StackPanel>
Свойство Rect
задает параметры прямоугольника в формате "координата X, координата Y ширина, высота". Также с помощью свойств RadiusX
и
RadiusY
можно задать радиус скругления углов прямоугольника.
EllipseGeometry:
<Path Fill="LightPink" Stroke="LightBlue"> <Path.Data> <EllipseGeometry RadiusX="50" RadiusY="25" Center="120,70" /> </Path.Data> </Path>
Свойство Center
устанавливает цетр овала, а свойста RadiusX
и RadiusY
- радиусы.
GeometryGroup объединяет несколько геометрий:
<Path Fill="LightPink" Stroke="LightBlue"> <Path.Data> <GeometryGroup FillRule="Nonzero"> <LineGeometry StartPoint="10,10" EndPoint="220,10" /> <EllipseGeometry Center="100,100" RadiusX="50" RadiusY="40" /> <RectangleGeometry Rect="120,100 80,20" RadiusX="5" RadiusY="5" /> </GeometryGroup> </Path.Data> </Path>
Объект GeometryGroup устанавливает свойство FillRule. Если оно равно EvenOdd (значение по умолчанию), то перекрывающиеся поверхности двух геометрий являются прозрачными. А при значении FillRule="Nonzero" (как в данном случае), перекрывающиеся поверхности геометрий будут окрашены также, как и остальные части пути.
CombinedGeometry состоит из двух геометрий. В этом он похож на GeometryGroup, который также может объединять две геометрии. Однако между ними есть различия. Отличие состоит в том, что объект CombinedGeometry имеет свойство GeometryCombinedMode, которое указывает модель перекрытия двух геометрий:
Union: фигура включает обе геометрии
Intersect: фигура включает область, которая одновременно принадлежит обеим геометриям
Xor: фигура включает только непересекающие области геометрий
Exclude: фигура включает первую геометрию с исключением тех областей, которые принадлежат также и второй геометрии
Применим все способы:
<Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Path Fill="LightPink" Stroke="LightBlue"> <Path.Data> <CombinedGeometry GeometryCombineMode="Union"> <CombinedGeometry.Geometry1> <EllipseGeometry Center="50,60" RadiusX="50" RadiusY="50" /> </CombinedGeometry.Geometry1> <CombinedGeometry.Geometry2> <RectangleGeometry Rect="60, 20 120,80" /> </CombinedGeometry.Geometry2> </CombinedGeometry> </Path.Data> </Path> <Path Grid.Row="1" Fill="LightPink" Stroke="LightBlue"> <Path.Data> <CombinedGeometry GeometryCombineMode="Xor"> <CombinedGeometry.Geometry1> <EllipseGeometry Center="50,60" RadiusX="50" RadiusY="50" /> </CombinedGeometry.Geometry1> <CombinedGeometry.Geometry2> <RectangleGeometry Rect="60, 20 120,80" /> </CombinedGeometry.Geometry2> </CombinedGeometry> </Path.Data> </Path> <Path Grid.Row="2" Fill="LightPink" Stroke="LightBlue"> <Path.Data> <CombinedGeometry GeometryCombineMode="Intersect"> <CombinedGeometry.Geometry1> <EllipseGeometry Center="50,60" RadiusX="50" RadiusY="50" /> </CombinedGeometry.Geometry1> <CombinedGeometry.Geometry2> <RectangleGeometry Rect="60, 20 120,80" /> </CombinedGeometry.Geometry2> </CombinedGeometry> </Path.Data> </Path> <Path Grid.Row="3" Fill="LightPink" Stroke="LightBlue"> <Path.Data> <CombinedGeometry GeometryCombineMode="Exclude"> <CombinedGeometry.Geometry1> <EllipseGeometry Center="50,60" RadiusX="50" RadiusY="50" /> </CombinedGeometry.Geometry1> <CombinedGeometry.Geometry2> <RectangleGeometry Rect="60, 20 120,80" /> </CombinedGeometry.Geometry2> </CombinedGeometry> </Path.Data> </Path> </Grid>