Классы Path и Geometry

21

В предыдущем разделе был показан ряд классов, унаследованных от Shape, включая Rectangle, Ellipse, Polygon и Polyline. Однако есть еще один класс-наследник Shape, который пока не рассматривался, хотя он намного мощнее прочих. Класс Path обладает способностью заключать в себе любую фигуру, группу фигур и более сложные ингредиенты вроде кривых.

Класс Path имеет единственное свойство по имени Data, принимающее объект Geometry, который определяет фигуру (или фигуры), образующие путь. Создавать объект Geometry напрямую нельзя, поскольку этот класс является абстрактным. Вместо этого нужно использовать один из его наследников, перечисленных ниже:

LineGeometry

Представляет прямую линию. Является геометрическим эквивалентом фигуры Line

RectangleGeometry

Представляет прямоугольник (необязательно — со скругленными углами). Является геометрическим эквивалентом фигуры Rectangle

EllipseGeometry

Представляет эллипс. Геометрический эквивалент фигуры Ellipse

GeometryGroup

Добавляет любое количество объектов Geometry к единственному пути, используя правило заполнения EvenOdd или NonZero для определения заполняемых областей

CombinedGeometry

Объединяет две геометрии в единую фигуру. Свойство CombineMode позволяет указать способ комбинирования составляющих

PathGeometry

Представляет более сложную фигуру, состоящую из дуг, кривых и линий, которая может быть как разомкнутой, так и замкнутой

StreamGeometry

Доступный только для чтения облегченный эквивалент PathGeometry. Класс StreamGeometry экономит память, поскольку не хранит в памяти сразу все индивидуальные сегменты пути. Однако однажды созданный объект не может быть модифицирован

Однако классы геометрии вовсе не так просты, как может показаться на первый взгляд. Для начала, они наследуются от Freezable (через базовый класс Geometry), что обеспечивает им поддержку уведомлений об изменениях. В результате этого, если для создания пути применена геометрия, которая затем модифицируется, путь будет перерисован автоматически. Классы геометрии также могут использоваться для определения рисунков, к которым применяется кисть, что обеспечивает простой способ рисования сложного содержимого, которое не нуждается в средствах взаимодействия с пользователем класса Path.

Здесь может возникнуть вопрос: в чем же разница между путем и геометрией? Геометрия определяет фигуру. Путь позволяет рисовать фигуру. Поэтому объект Geometry определяет такие детали, как координаты и размер фигуры, в то время как объект Path применяет кисти Stroke и Fill, чтобы нарисовать ее. Класс Path также включает средства, унаследованные им от инфраструктуры UIElement, такие как обработка событий мыши и клавиатуры.

Геометрии линий, прямоугольников и эллипсов

Классы LineGeometry, RectangleGeometry и EllipseGeometry отображаются непосредственно на фигуры Line, Rectangle и Ellipse, которые должны быть знакомы. Например, приведенный ниже код разметки, в котором используется элемент Rectangle:

<Rectangle Fill="Yellow" Stroke="Blue" Width="100" Height="50"></Rectangle>

можно преобразовывать в следующий код разметки, где применяется элемент Path:

<Path Fill="Yellow" Stroke="Blue">
   <Path.Data>
      <RectangleGeometry Rect="0,0 100,50"></RectangleGeometry>
   </Path.Data>
</Path>

Единственное реальное отличие состоит в том, что фигура Rectangle принимает значения Height и Width, в то время как RectangleGeometry принимает четыре числа, описывающих размер и расположение прямоугольника. Первые два числа описывают координаты X и Y точки расположения левого верхнего угла, а последние два числа устанавливают ширину и высоту прямоугольника. Можно указать начало прямоугольника в точке (0,0) и получить тот же эффект, что и от обычного элемента Rectangle, или сместить прямоугольник, используя другие значения. Класс RectangleGeometry также включает свойства RadiusX и RadiusY, позволяющие скруглить углы.

Аналогично, следующую линию:

<Line Stroke="Blue" X1="0" Y1="0" X2="10" Y2="100"></Line>

можно преобразовать в объект LineGeometry:

<Path Fill="Yellow" Stroke="Blue">
   <Path.Data>
      <LineGeometry StartPoint = "0,0" EndPoint = "10, 100"></LineGeometry>
   </Path.Data>
</Path>

Показанный ниже эллипс:

<Ellipse Fill="Yellow" Stroke="Blue"
   Width=" 100" Height="50" HonzontalAlignment="Left"></Ellipse>

можно преобразовать в следующий объект EllipseGeometry:

<Path Fill="Yellow" Stroke="Blue">
   <Path.Data>
      <EllipseGeometry RadiusX="50" RadiusY="25" Center="50,25"></EllipseGeometry>
   </Path.Data>
</Path>

Обратите внимание, что значения радиуса составляют просто половину значений ширины и высоты. С помощью свойства Center эллипс смещается. В данном примере центр размещается точно посредине описанного вокруг эллипса прямоугольника, так что он рисуется точно так же, как и фигура Ellipse.

В общем, эти простые классы геометрии работают точно так же, как соответствующие им фигуры. Появляется дополнительная возможность смещения прямоугольников и эллипсов, но это не обязательно в случае помещения фигур на поверхность контейнера Canvas, который предоставляет возможность позиционирования фигур в заданных местах. Фактически, если это все, что нужно делать с объектами геометрии, то, скорее всего, связываться с элементом Path не имеет смысла. Отличие проявляется тогда, когда вы решите комбинировать более одного геометрического объекта в одном пути.

Пройди тесты
Лучший чат для C# программистов