• Статья
  • Чтение занимает 4 мин

В этом разделе приводятся общие сведения о том, как рисовать с помощью Shape объектов. Shape— Это тип UIElement , который позволяет нарисовать форму на экране. Поскольку они являются элементами пользовательского интерфейса, Shape объекты могут использоваться внутри Panel элементов и большинства элементов управления.

Windows Presentation Foundation (WPF) предоставляет несколько уровней доступа к службам для работы с графикой и службам рендеринга. На верхнем уровне Shape объекты просты в использовании и предоставляют множество полезных функций, таких как макет и участие в Windows Presentation Foundation (WPF) системе событий.

Объекты фигур

WPF предоставляет ряд готовых к использованию Shape объектов. Все объекты Shape наследуются от Shape класса. Доступные объекты фигур: Ellipse , Line , Path , Polygon , Polyline и Rectangle . Shape объекты имеют следующие общие свойства.

  • Stroke: Описывает рисование контура фигуры.

  • StrokeThickness: Описывает толщину контура фигуры.

  • Fill: Описывает, как рисуется внутренняя часть фигуры.

  • Свойства данных, определяющие координаты и вершины, измеряются в аппаратно-независимых пикселях.

Так как они являются производными от UIElement , объекты Shape можно использовать внутри панелей и большинства элементов управления. CanvasПанель является особенно хорошим выбором для создания сложных рисунков, так как она поддерживает абсолютное позиционирование дочерних объектов.

LineКласс позволяет нарисовать линию между двумя точками. В следующем примере показано несколько способов указания координат линии и свойств штриха.

<Canvas Height="300" Width="300">

  <!-- Draws a diagonal line from (10,10) to (50,50). -->
  <Line
    X1="10" Y1="10"
    X2="50" Y2="50"
    Stroke="Black"
    StrokeThickness="4" />

  <!-- Draws a diagonal line from (10,10) to (50,50)
       and moves it 100 pixels to the right. -->
  <Line
    X1="10" Y1="10"
    X2="50" Y2="50"
    StrokeThickness="4"
    Canvas.Left="100">
    <Line.Stroke>
      <RadialGradientBrush GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5">
        <RadialGradientBrush.GradientStops>
          <GradientStop Color="Red" Offset="0" />
          <GradientStop Color="Blue" Offset="0.25" />
        </RadialGradientBrush.GradientStops>
      </RadialGradientBrush>
    </Line.Stroke>
  </Line>

  <!-- Draws a horizontal line from (10,60) to (150,60). -->
  <Line
     X1="10" Y1="60"
     X2="150" Y2="60"
     Stroke="Black"
     StrokeThickness="4"/>

</Canvas>

// Add a Line Element
myLine = gcnew Line();
myLine->Stroke = Brushes::LightSteelBlue;
myLine->X1 = 1;
myLine->X2 = 50;
myLine->Y1 = 1;
myLine->Y2 = 50;
myLine->HorizontalAlignment = HorizontalAlignment::Left;
myLine->VerticalAlignment = VerticalAlignment::Center;
myLine->StrokeThickness = 2;
myGrid->Children->Add(myLine);

// Add a Line Element
myLine = new Line();
myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
myLine.X1 = 1;
myLine.X2 = 50;
myLine.Y1 = 1;
myLine.Y2 = 50;
myLine.HorizontalAlignment = HorizontalAlignment.Left;
myLine.VerticalAlignment = VerticalAlignment.Center;
myLine.StrokeThickness = 2;
myGrid.Children.Add(myLine);

' Add a Line Element
Dim myLine As New Line()
myLine.Stroke = Brushes.LightSteelBlue
myLine.X1 = 1
myLine.X2 = 50
myLine.Y1 = 1
myLine.Y2 = 50
myLine.HorizontalAlignment = HorizontalAlignment.Left
myLine.VerticalAlignment = VerticalAlignment.Center
myLine.StrokeThickness = 2
myGrid.Children.Add(myLine)

На следующем рисунке показан отображаемый объект Line .

Иллюстрация линии

Несмотря на то Line , что класс предоставляет Fill свойство, его установка не имеет результата, поскольку не Line имеет области.

Другой распространенной фигурой является Ellipse . Создайте Ellipse , определив Width свойства фигуры и Height . Чтобы нарисовать круг, укажите, Ellipse Width значения и Height равны.

<Ellipse
Fill="Yellow"
Height="100"
Width="200"
StrokeThickness="2"
Stroke="Black"/>

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;

namespace SDKSample
{
    public partial class SetBackgroundColorOfShapeExample : Page
    {
        public SetBackgroundColorOfShapeExample()
        {
            // Create a StackPanel to contain the shape.
            StackPanel myStackPanel = new StackPanel();

            // Create a red Ellipse.
            Ellipse myEllipse = new Ellipse();

            // Create a SolidColorBrush with a red color to fill the
            // Ellipse with.
            SolidColorBrush mySolidColorBrush = new SolidColorBrush();

            // Describes the brush's color using RGB values.
            // Each value has a range of 0-255.
            mySolidColorBrush.Color = Color.FromArgb(255, 255, 255, 0);
            myEllipse.Fill = mySolidColorBrush;
            myEllipse.StrokeThickness = 2;
            myEllipse.Stroke = Brushes.Black;

            // Set the width and height of the Ellipse.
            myEllipse.Width = 200;
            myEllipse.Height = 100;

            // Add the Ellipse to the StackPanel.
            myStackPanel.Children.Add(myEllipse);

            this.Content = myStackPanel;
        }
    }
}

Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Shapes

Namespace SDKSample
    Partial Public Class SetBackgroundColorOfShapeExample
        Inherits Page
        Public Sub New()
            ' Create a StackPanel to contain the shape.
            Dim myStackPanel As New StackPanel()

            ' Create a red Ellipse.
            Dim myEllipse As New Ellipse()

            ' Create a SolidColorBrush with a red color to fill the 
            ' Ellipse with.
            Dim mySolidColorBrush As New SolidColorBrush()

            ' Describes the brush's color using RGB values. 
            ' Each value has a range of 0-255.
            mySolidColorBrush.Color = Color.FromArgb(255, 255, 255, 0)
            myEllipse.Fill = mySolidColorBrush
            myEllipse.StrokeThickness = 2
            myEllipse.Stroke = Brushes.Black

            ' Set the width and height of the Ellipse.
            myEllipse.Width = 200
            myEllipse.Height = 100

            ' Add the Ellipse to the StackPanel.
            myStackPanel.Children.Add(myEllipse)

            Me.Content = myStackPanel
        End Sub

    End Class
End Namespace

На следующем рисунке показан пример отображаемого объекта Ellipse .

Иллюстрация эллипса

Использование путей и геометрических фигур

PathКласс позволяет рисовать кривые и сложные фигуры. Эти кривые и фигуры описываются с помощью Geometry объектов. Чтобы использовать Path , создайте Geometry и используйте его для задания Path Data свойства объекта.

Существует множество Geometry объектов для выбора. LineGeometryКлассы, RectangleGeometry и EllipseGeometry описывают относительно простые фигуры. Чтобы создать более сложные фигуры или создать кривые, используйте PathGeometry .

Классы PathGeometry и PathSegment

PathGeometry объекты состоят из одного или нескольких PathFigure объектов; каждый из них PathFigure представляет отдельную фигуру или форму. Каждый из них PathFigure состоит из одного или нескольких PathSegment объектов, каждый из которых представляет собой подключенную часть рисунка или фигуры. Типы сегментов включают следующие: LineSegment , BezierSegment и ArcSegment .

В следующем примере Path используется для отрисовки кривой Безье квадратичных кривых.

<Path Stroke="Black" StrokeThickness="1">
  <Path.Data>
    <PathGeometry>
      <PathGeometry.Figures>
        <PathFigureCollection>
          <PathFigure StartPoint="10,100">
            <PathFigure.Segments>
              <PathSegmentCollection>
                <QuadraticBezierSegment Point1="200,200" Point2="300,100" />
              </PathSegmentCollection>
            </PathFigure.Segments>
          </PathFigure>
        </PathFigureCollection>
      </PathGeometry.Figures>
    </PathGeometry>
  </Path.Data>
</Path>

На следующем рисунке показана преобразованная для просмотра фигура.

Иллюстрация пути

Дополнительные сведения о PathGeometry и других Geometry классах см. в разделе Общие сведения о геометрии.

Сокращенный синтаксис XAML

В Язык XAML можно также использовать специальный сокращенный синтаксис для описания Path . В следующем примере сокращенный синтаксис используется для рисования сложной фигуры.

      <Path Stroke="DarkGoldenRod" StrokeThickness="3"
Data="M 100,200 C 100,25 400,350 400,175 H 280" />  

На следующем рисунке показан отображаемый объект Path .

Иллюстрация пути

DataСтрока атрибута начинается с команды «MoveTo», обозначенной буквой M, которая устанавливает начальную точку для пути в системе координат Canvas . Path в параметрах данных учитывается регистр. Прописная M указывает на абсолютное расположение новой текущей точки. Строчная буква m указывала бы относительные координаты. Первый сегмент представляет собой кубическую кривую Безье, которая начинается в точке (100, 200) и заканчивается в точке (400, 175). Эта кривая нарисована с помощью двух контрольных точек (100, 25) и (400, 350). Этот сегмент обозначается командой C в Data строке атрибута. Опять же, заглавная буква C указывает абсолютный путь; строчная буква c указывает относительный путь.

Второй сегмент начинается с команды lineto H, которая рисует горизонтальную линию от предыдущей точки пути (400, 175) до новой точки (280, 175). Так как это команда по горизонтали «lineto», указанное значение является координатой x.

Полный синтаксис пути см Data . в справочнике и создании фигуры с помощью PathGeometry.

Заполнение фигур

Brush объекты используются для заполнения фигур Stroke и Fill . В следующем примере задаются штрих и Fill элемента Ellipse . Обратите внимание, что значения свойств кисти могут задаваться только в формате ключевого слова или шестнадцатеричного значения цвета. Дополнительные сведения о доступных цветовых ключевых словах см Colors . в разделе Свойства класса в System.Windows.Media пространстве имен.

<Canvas Background="LightGray">
   <Ellipse  
      Canvas.Top="50"  
      Canvas.Left="50"  
      Fill="#FFFFFF00"  
      Height="75"  
      Width="75"  
      StrokeThickness="5"  
      Stroke="#FF0000FF"/>  
</Canvas>  

На следующем рисунке показан отображаемый объект Ellipse .

Эллипс

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

<!-- This polygon shape uses pre-defined color values for its Stroke and  
     Fill properties.   
     The SolidColorBrush's Opacity property affects the fill color in   
     this case by making it slightly transparent (opacity of 0.4) so   
     that it blends with any underlying color. -->  
  
<Polygon  
    Points="300,200 400,125 400,275 300,200"  
    Stroke="Purple"
    StrokeThickness="2">  
    <Polygon.Fill>  
       <SolidColorBrush Color="Blue" Opacity="0.4"/>  
    </Polygon.Fill>  
</Polygon>  

На рисунке ниже показана фигура, преобразованная для просмотра.

Иллюстрация SolidColorBrush

Для заполнения фигуры также можно использовать штриховку, градиенты, изображения, шаблоны и многое другое. Дополнительные сведения см. в разделе Общие сведения о рисовании с помощью сплошных цветов и градиентов.

Растягиваемые фигуры

Line Path Polygon Все классы,,, Polyline и Rectangle имеют Stretch свойство. Это свойство определяет, как Shape содержимое объекта (рисуемая фигура) растягивается для заполнения Shape пространства макета объекта. ShapeПространство макета объекта — это объем пространства, Shape выделенного системой макета, из-за явной Width Height настройки, или из-за HorizontalAlignment VerticalAlignment параметров и. Дополнительные сведения о макете в Windows Presentation Foundation см. в разделе Общие сведения о макете .

Свойство Stretch принимает одно из следующих значений.

  • None: Shape Содержимое объекта не растягивается.

  • Fill: Shape Содержимое объекта растягивается для заполнения пространства макета. Пропорции не сохраняются.

  • Uniform: Shape Содержимое объекта растягивается настолько, насколько возможно, для заполнения пространства макета с сохранением исходного пропорций.

  • UniformToFill: Shape Содержимое объекта растягивается для полного заполнения пространства макета с сохранением исходного пропорций.

Обратите внимание, что при Shape растяжении содержимого объекта Shape контур объекта закрашивается после растяжения.

В следующем примере Polygon используется для рисования очень маленького треугольника с (0, 0) до (1, 1). PolygonОбъект и имеет Width Height значение 100, а свойство Stretch имеет значение Fill. В результате Polygon содержимое объекта (треугольник) растягивается для заполнения большего пространства.

<Polygon  
  Points="0,0 0,1 1,1"  
  Fill="Blue"  
  Width="100"  
  Height="100"  
  Stretch="Fill"  
  Stroke="Black"  
  StrokeThickness="2" />  
PointCollection myPointCollection = new PointCollection();  
myPointCollection.Add(new Point(0,0));  
myPointCollection.Add(new Point(0,1));  
myPointCollection.Add(new Point(1,1));  
  
Polygon myPolygon = new Polygon();  
myPolygon.Points = myPointCollection;  
myPolygon.Fill = Brushes.Blue;  
myPolygon.Width = 100;  
myPolygon.Height = 100;  
myPolygon.Stretch = Stretch.Fill;  
myPolygon.Stroke = Brushes.Black;  
myPolygon.StrokeThickness = 2;  

Преобразование фигур

TransformКласс предоставляет средства для преобразования фигур в двумерной плоскости. К различным типам преобразований относятся вращение ( RotateTransform ), Scale ( ScaleTransform ), асимметрия ( SkewTransform ) и Translation ( TranslateTransform ).

Распространенным преобразованием фигуры является поворот. Чтобы повернуть фигуру, создайте RotateTransform и укажите ее Angle . Значение, Angle равное 45, поворачивает элемент на 45 градусов по часовой стрелке; угол 90 поворачивает элемент на 90 градусов по часовой стрелке и т. д. Задайте CenterX Свойства и, CenterY Если требуется управлять точкой, вокруг которой поворачивается элемент. Эти значения свойств выражаются в системе координат преобразуемого элемента. CenterX и CenterY имеют нулевые значения по умолчанию. Наконец, примените RotateTransform к элементу. Если вы не хотите, чтобы преобразование влияло на макет, установите RenderTransform свойство фигуры.

В следующем примере RotateTransform используется для поворота фигуры 45 градусов относительно левого верхнего угла фигуры (0, 0).

<!-- Rotates the Polyline 45 degrees about the point (0,0). -->
<Polyline Points="25,25 0,50 25,75 50,50 25,25 25,0" 
  Stroke="Blue" StrokeThickness="10"
  Canvas.Left="75" Canvas.Top="50">
  <Polyline.RenderTransform>
    <RotateTransform CenterX="0" CenterY="0" Angle="45" />
  </Polyline.RenderTransform>
</Polyline>

В следующем примере другая фигура поворачивается на 45 градусов, но на этот раз — вокруг точки (25, 50).

<!-- Rotates the Polyline 45 degrees about its center. -->
<Polyline 
  Points="25,25 0,50 25,75 50,50 25,25 25,0" 
  Stroke="Blue" StrokeThickness="10"
  Canvas.Left="75" Canvas.Top="50"
  RenderTransformOrigin="0.5,0.5">
  <Polyline.RenderTransform>
    <RotateTransform Angle="45" />
  </Polyline.RenderTransform>
</Polyline>

На следующем рисунке показаны результаты двух преобразований.

Повороты на 45 градусов с разными центральными точками

В предыдущих примерах к каждому объекту фигуры применяется одно преобразование. Чтобы применить несколько преобразований к фигуре (или любому другому элементу пользовательского интерфейса), используйте TransformGroup .

См. также раздел

  • Двумерная графика и изображения
  • Общие сведения о закраске сплошным цветом и градиентом
  • Общие сведения о классе Geometry
  • Пошаговое руководство: My first WPF desktop application (Пошаговое руководство. Создание классического приложения WPF)
  • Общие сведения об эффектах анимации