Поделиться через


Обзор объектов Drawing

Обновлен: Ноябрь 2007

В этом разделе представлены объекты Drawing и инструкции по их использованию для эффективного рисования фигур, точечных рисунков, текста и мультимедиа. Используйте объекты Drawing при создании картинок, рисования при помощи DrawingBrush или использовании объектов Visual.

В этом разделе содержатся следующие подразделы.

  • Понятие объекта Drawing
  • Рисование фигуры
  • Рисование изображения
  • Воспроизведение мультимедиа (только код)
  • Вывод текста
  • Составные объекты Drawing
  • Отображение объекта Drawing как изображения
  • Закраска объекта с помощью Drawing
  • Отображение Drawing с помощью Visual
  • Объекты DrawingContext
  • Перечисление содержимого Visual
  • Связанные разделы

Понятие объекта Drawing

Объект Drawing описывает отображаемое содержимое, такое как фигура, точечный рисунок, видео или строка текста. Различные типы графических объектов описывают различные типы содержимого. Ниже приведен список различных типов графических объектов.

  • GeometryDrawing — выводит фигуру.

  • ImageDrawing — выводит изображение.

  • GlyphRunDrawing — выводит текст.

  • VideoDrawing — воспроизводит аудио- или видеофайл.

  • DrawingGroup — выводит другие объекты Drawing. Используйте группировку изображений для объединения других рисунков в один составной рисунок.

Объекты Drawing являются универсальными. Существует множество способов использования объекта Drawing.

  • Можно отобразить его в виде изображения с помощью DrawingImage и элемента управления Image.

  • Можно использовать его с DrawingBrush для рисования объекта, например, Background для Page.

  • Можно использовать его для описания внешнего вида DrawingVisual.

  • Можно использовать его для перечисления содержимого Visual.

WPF предоставляет другие типы объектов, способных рисовать фигуры, точечные рисунки, текст и мультимедиа. Например, можно также использовать объекты Shape для рисования фигур, и элемент управления MediaElement предоставляет другой способ добавления видео в приложение. В каких случаях следует использовать объекты Drawing? Когда можно посвятить возможности уровня среды получению выигрыша в производительности или при необходимости в возможностях Freezable. Поскольку объекты Drawing не поддерживают ввод Система макета и фокусировку, они обеспечивают выигрыш в производительности, что делает их идеальным средством описания фоновых рисунков, картинок и низкоуровневых рисунков с объектами Visual.

Поскольку они являются объектами типа Freezable, объекты Drawing приобретают несколько особых возможностей, к которым относятся следующие: они могут быть объявлены как ресурсы, которые совместно используются несколькими объектами, сделаны предназначенными только для чтения в целях повышения быстродействия, копированы, а также сделаны безопасными для использования в многопоточных программах. Дополнительные сведения о различных возможностях, предоставляемых объектами класса Freezable, см. в разделе Общие сведения об объектах класса Freezable.

Рисование фигуры

Чтобы нарисовать фигуру, используется объект GeometryDrawing. Его свойство Geometry описывает фигуру, которую нужно нарисовать, его свойство Brush описывает способ закраски внутренней части фигуры, его свойство Pen описывает способ прорисовки его структуры.

В следующем примере GeometryDrawing используется для рисования фигуры. Фигура описывается GeometryGroup и двумя объектами EllipseGeometry. Внутренняя часть фигуры рисуется с помощью LinearGradientBrush, а ее контур — с помощью Black Pen.

В этом примере создается следующий GeometryDrawing.

GeometryDrawing
GeometryDrawing двух эллипсов

//
// Create the Geometry to draw.
//
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(
    new EllipseGeometry(new Point(50,50), 45, 20)
    );
ellipses.Children.Add(
    new EllipseGeometry(new Point(50, 50), 20, 45)
    );


//
// Create a GeometryDrawing.
//
GeometryDrawing aGeometryDrawing = new GeometryDrawing();
aGeometryDrawing.Geometry = ellipses;

// Paint the drawing with a gradient.
aGeometryDrawing.Brush = 
    new LinearGradientBrush(
        Colors.Blue, 
        Color.FromRgb(204,204,255), 
        new Point(0,0), 
        new Point(1,1));

// Outline the drawing with a solid color.
aGeometryDrawing.Pen = new Pen(Brushes.Black, 10);
<GeometryDrawing>
  <GeometryDrawing.Geometry>

    <!-- Create a composite shape. -->
    <GeometryGroup>
      <EllipseGeometry Center="50,50" RadiusX="45" RadiusY="20" />
      <EllipseGeometry Center="50,50" RadiusX="20" RadiusY="45" />
    </GeometryGroup>
  </GeometryDrawing.Geometry>
  <GeometryDrawing.Brush>

    <!-- Paint the drawing with a gradient. -->
    <LinearGradientBrush>
      <GradientStop Offset="0.0" Color="Blue" />
      <GradientStop Offset="1.0" Color="#CCCCFF" />
    </LinearGradientBrush>
  </GeometryDrawing.Brush>
  <GeometryDrawing.Pen>

    <!-- Outline the drawing with a solid color. -->
    <Pen Thickness="10" Brush="Black" />
  </GeometryDrawing.Pen>
</GeometryDrawing>

Полный пример см. в разделе Практическое руководство. Создание GeometryDrawing.

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

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

Рисование изображения

Для рисования изображения используется ImageDrawing. Свойство объекта ImageDrawingImageSource описывает изображение, которое нужно нарисовать, а его свойство Rect определяет область, где рисуется изображение.

В следующем примере изображение рисуется в прямоугольнике, расположенном в точке (75,75), размером 100 на 100 точек. На следующем рисунке показан ImageDrawing, созданный в примере. Серая граница была добавлена, чтобы показать границы ImageDrawing.

ImageDrawing размером 100 на 100
ImageDrawing размером 100 на 100, отрисованный на (75,75)

// Create a 100 by 100 image with an upper-left point of (75,75). 
ImageDrawing bigKiwi = new ImageDrawing();
bigKiwi.Rect = new Rect(75, 75, 100, 100);
bigKiwi.ImageSource = new BitmapImage(
    new Uri(@"sampleImages\kiwi.png", UriKind.Relative));
<!-- The Rect property specifies that the image only fill a 100 by 100
     rectangular area. -->
<ImageDrawing Rect="75,75,100,100" ImageSource="sampleImages\kiwi.png"/>

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

Воспроизведение мультимедиа (только код)

ms751619.alert_note(ru-ru,VS.90).gifПримечание.

Хотя можно объявить VideoDrawing в Язык XAML (Extensible Application Markup Language), можно загрузить и воспроизвести в нем мультимедиа только с помощью кода. Чтобы воспроизвести видео в Язык XAML (Extensible Application Markup Language), лучше используйте MediaElement.

Для воспроизведения аудио- и видеофайлов следует использовать VideoDrawing и MediaPlayer. Существуют два способа загрузки и воспроизведения файлов мультимедиа. Первый способ заключается в использовании MediaPlayer и VideoDrawing, а второй — в создании собственных MediaTimeline для использования с MediaPlayer и VideoDrawing.

ms751619.alert_note(ru-ru,VS.90).gifПримечание.

При передаче файлов мультимедиа приложениям файл мультимедиа, в отличие от изображений, нельзя использовать в качестве ресурса проекта. Вместо этого в файле проекта необходимо задать для типа мультимедиа значение Content, а для CopyToOutputDirectory — PreserveNewest или Always.

Чтобы воспроизвести мультимедиа, не создавая собственной MediaTimeline, выполните следующие действия.

  1. Создание объекта MediaPlayer.

    MediaPlayer player = new MediaPlayer();
    
  2. Используйте метод Open для загрузки файла мультимедиа.

    player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
    
  3. Создайте таблицу VideoDrawing.

    VideoDrawing aVideoDrawing = new VideoDrawing();
    
  4. Укажите размер и расположение для отображения мультимедиа, задав свойство Rect для VideoDrawing.

    aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
    
  5. Укажите в свойстве Player для VideoDrawing созданный объект MediaPlayer.

    aVideoDrawing.Player = player;
    
  6. Используйте метод Play созданного MediaPlayer, чтобы начать воспроизведение мультимедиа.

    // Play the video once.
    player.Play();        
    

В следующем примере VideoDrawing и MediaPlayer используются для однократного воспроизведения видеофайла.

//
// Create a VideoDrawing.
//      
MediaPlayer player = new MediaPlayer();

player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));

VideoDrawing aVideoDrawing = new VideoDrawing();

aVideoDrawing.Rect = new Rect(0, 0, 100, 100);

aVideoDrawing.Player = player;

// Play the video once.
player.Play();        

Чтобы получить дополнительное управление временем для мультимедиа, используйте MediaTimeline с объектами MediaPlayer и VideoDrawing. MediaTimeline позволяет задать повтор воспроизведения видеофайла. Чтобы использовать MediaTimeline с VideoDrawing, выполните следующие действия:

  1. Объявите MediaTimeline и задайте ее временные характеристики.

    // Create a MediaTimeline.
    MediaTimeline mTimeline = 
        new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative)); 
    
    // Set the timeline to repeat.
    mTimeline.RepeatBehavior = RepeatBehavior.Forever;
    
  2. Создайте MediaClock из MediaTimeline.

    // Create a clock from the MediaTimeline.
    MediaClock mClock = mTimeline.CreateClock();
    
  3. Создайте MediaPlayer и используйте MediaClock для установки его свойства Clock.

    MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
    repeatingVideoDrawingPlayer.Clock = mClock;
    
  4. Создайте VideoDrawing и задайте MediaPlayer значение свойства Player объекта VideoDrawing.

    VideoDrawing repeatingVideoDrawing = new VideoDrawing();
    repeatingVideoDrawing.Rect = new Rect(150, 0, 100, 100);
    repeatingVideoDrawing.Player = repeatingVideoDrawingPlayer;  
    

В следующем примере MediaTimeline используется с MediaPlayer и VideoDrawing для повторяющегося воспроизведения видео.

//
// Create a VideoDrawing that repeats.
//

// Create a MediaTimeline.
MediaTimeline mTimeline = 
    new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative)); 

// Set the timeline to repeat.
mTimeline.RepeatBehavior = RepeatBehavior.Forever;

// Create a clock from the MediaTimeline.
MediaClock mClock = mTimeline.CreateClock();

MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
repeatingVideoDrawingPlayer.Clock = mClock;

VideoDrawing repeatingVideoDrawing = new VideoDrawing();
repeatingVideoDrawing.Rect = new Rect(150, 0, 100, 100);
repeatingVideoDrawing.Player = repeatingVideoDrawingPlayer;  

Обратите внимание, что при использовании MediaTimeline, используется интерактивный ClockController, который возвращается свойством Controller для MediaClock и позволяет управлять воспроизведением мультимедиа, вместо интерактивных методов MediaPlayer.

Вывод текста

Чтобы вывести текст, используется GlyphRunDrawing и GlyphRun. В следующем примере GlyphRunDrawing используется для вывода текста «Hello World».

GlyphRun theGlyphRun = new GlyphRun(
    new GlyphTypeface(new Uri(@"C:\WINDOWS\Fonts\TIMES.TTF")),
    0,
    false,
    13.333333333333334,
    new ushort[]{43, 72, 79, 79, 82, 3, 58, 82, 85, 79, 71},
    new Point(0, 12.29),
    new double[]{
        9.62666666666667, 7.41333333333333, 2.96, 
        2.96, 7.41333333333333, 3.70666666666667, 
        12.5866666666667, 7.41333333333333, 
        4.44, 2.96, 7.41333333333333},
    null,
    null,
    null,
    null,
    null,
    null


    );

GlyphRunDrawing gDrawing = new GlyphRunDrawing(Brushes.Black, theGlyphRun);
<GlyphRunDrawing ForegroundBrush="Black">
  <GlyphRunDrawing.GlyphRun>
    <GlyphRun 
      CaretStops="{x:Null}" 
      ClusterMap="{x:Null}" 
      IsSideways="False" 
      GlyphOffsets="{x:Null}" 
      GlyphIndices="43 72 79 79 82 3 58 82 85 79 71" 
      BaselineOrigin="0,12.29"  
      FontRenderingEmSize="13.333333333333334" 
      DeviceFontName="{x:Null}" 
      AdvanceWidths="9.62666666666667 7.41333333333333 2.96 2.96 7.41333333333333 3.70666666666667 12.5866666666667 7.41333333333333 4.44 2.96 7.41333333333333" 
      BidiLevel="0">
      <GlyphRun.GlyphTypeface>
        <GlyphTypeface FontUri="C:\WINDOWS\Fonts\TIMES.TTF" />
      </GlyphRun.GlyphTypeface>
    </GlyphRun>
  </GlyphRunDrawing.GlyphRun>
</GlyphRunDrawing>

GlyphRun является низкоуровневым объектом, предназначенным для использования с представлением документа фиксированного формата и сценариями печати. Более простым способом вывода текста на экран является использование Label или TextBlock. Дополнительные сведения о GlyphRun см. в обзоре Знакомство с объектом GlyphRun и элементом Glyphs.

Составные объекты Drawing

DrawingGroup позволяет объединить несколько рисунков в один составной рисунок. С помощью DrawingGroup можно объединить фигуры, рисунки и текст в один объект Drawing.

В следующем примере DrawingGroup используется для объединения двух объектов GeometryDrawing и объекта ImageDrawing. В результате выполнения примера получается следующий результат:

Составной рисунок
DrawingGroup с множественными отрисовками

//
// Create three drawings.
//
GeometryDrawing ellipseDrawing =
    new GeometryDrawing(
        new SolidColorBrush(Color.FromArgb(102, 181, 243, 20)),
        new Pen(Brushes.Black, 4),
        new EllipseGeometry(new Point(50,50), 50, 50)
    );

ImageDrawing kiwiPictureDrawing = 
    new ImageDrawing(
        new BitmapImage(new Uri(@"sampleImages\kiwi.png", UriKind.Relative)), 
        new Rect(50,50,100,100));

GeometryDrawing ellipseDrawing2 =
    new GeometryDrawing(
        new SolidColorBrush(Color.FromArgb(102,181,243,20)),
        new Pen(Brushes.Black, 4),
        new EllipseGeometry(new Point(150, 150), 50, 50)
    );

// Create a DrawingGroup to contain the drawings.
DrawingGroup aDrawingGroup = new DrawingGroup();
aDrawingGroup.Children.Add(ellipseDrawing);
aDrawingGroup.Children.Add(kiwiPictureDrawing);
aDrawingGroup.Children.Add(ellipseDrawing2);

<DrawingGroup>

  <GeometryDrawing Brush="#66B5F314">
    <GeometryDrawing.Geometry>
      <EllipseGeometry Center="50,50" RadiusX="50"  RadiusY="50"/>
    </GeometryDrawing.Geometry>
    <GeometryDrawing.Pen>
      <Pen Brush="Black" Thickness="4" />
    </GeometryDrawing.Pen>
  </GeometryDrawing>
  <ImageDrawing ImageSource="sampleImages\kiwi.png" Rect="50,50,100,100"/>
  <GeometryDrawing Brush="#66B5F314">
    <GeometryDrawing.Geometry>
      <EllipseGeometry Center="150,150" RadiusX="50"  RadiusY="50"/>
    </GeometryDrawing.Geometry>
    <GeometryDrawing.Pen>
      <Pen Brush="Black" Thickness="4" />
    </GeometryDrawing.Pen>
  </GeometryDrawing>
</DrawingGroup>

DrawingGroup также позволяет применять маски непрозрачности, преобразования, эффекты точечного рисунка и другие операции с содержимым. Операции DrawingGroup применяются в следующем порядке: OpacityMask, Opacity, BitmapEffect, ClipGeometry, GuidelineSet и затем Transform.

Ниже показан порядок, в котором выполняются операции DrawingGroup.

Порядок операций DrawingGroup
Порядок DrawingGroup для операций

В следующей таблице описаны свойства, которые можно использовать для обработки содержимого объекта DrawingGroup.

Свойство

Описание

Иллюстрация

OpacityMask

Изменяет непрозрачность выбранной части содержимого DrawingGroup. Пример см. в разделе Практическое руководство. Управление прозрачностью рисунка.

DrawingGroup с маской непрозрачности

Opacity

Однородно изменяет непрозрачность содержимого DrawingGroup. Это свойство позволяет сделать Drawing прозрачным или частично прозрачным. Пример см. в разделе Практическое руководство. Применение маски непрозрачности к документу.

DrawingGroups с различными параметрами непрозрачности

BitmapEffect

Применяет BitmapEffect к содержимому DrawingGroup. Пример см. в разделе Практическое руководство. Применение BitmapEffect к рисованию.

DrawingGroup с BlurBitmapEffect

ClipGeometry

Обрезает содержимое DrawingGroup вне границ области, заданной с помощью Geometry. Пример см. в разделе Практическое руководство. Обрезка изображения.

DrawingGroup с определенной областью обрезки

GuidelineSet

Привязывает независимые от устройства точки к пикселям устройства, следуя указанным правилам. Это свойство нужно, чтобы гарантировать, что детализированные графики отображаются резко на дисплеях с низким разрешением. Пример см. в разделе Практическое руководство. Применение GuidelineSet к рисованию.

DrawingGroup с и без GuidelineSet

Transform

Преобразует содержимое DrawingGroup. Пример см. в разделе Как применить преобразование к рисованию.

Повернутый DrawingGroup

Отображение объекта Drawing как изображения

Чтобы отобразить Drawing в элементе управления Image, используйте объект DrawingImage элемента управления Image в качестве источника Source и установите для объекта DrawingImage свойство DrawingImage.Drawing для рисунка, который нужно отобразить.

В следующем примере используется объект DrawingImage и элемент управления Image для отображения объекта GeometryDrawing. В результате выполнения примера получается следующий результат:

DrawingImage
GeometryDrawing двух эллипсов

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

namespace SDKSample
{
    public class DrawingImageExample : Page
    {

        public DrawingImageExample()
        {

            //
            // Create the Geometry to draw.
            //
            GeometryGroup ellipses = new GeometryGroup();
            ellipses.Children.Add(
                new EllipseGeometry(new Point(50,50), 45, 20)
                );
            ellipses.Children.Add(
                new EllipseGeometry(new Point(50, 50), 20, 45)
                );

            //
            // Create a GeometryDrawing.
            //
            GeometryDrawing aGeometryDrawing = new GeometryDrawing();
            aGeometryDrawing.Geometry = ellipses;

            // Paint the drawing with a gradient.
            aGeometryDrawing.Brush = 
                new LinearGradientBrush(
                    Colors.Blue, 
                    Color.FromRgb(204,204,255), 
                    new Point(0,0), 
                    new Point(1,1));

            // Outline the drawing with a solid color.
            aGeometryDrawing.Pen = new Pen(Brushes.Black, 10);

            //
            // Use a DrawingImage and an Image control
            // to display the drawing.
            //
            DrawingImage geometryImage = new DrawingImage(aGeometryDrawing);

            // Freeze the DrawingImage for performance benefits.
            geometryImage.Freeze();

            Image anImage = new Image();
            anImage.Source = geometryImage;
            anImage.HorizontalAlignment = HorizontalAlignment.Left;

            //
            // Place the image inside a border and
            // add it to the page.
            //
            Border exampleBorder = new Border();
            exampleBorder.Child = anImage;
            exampleBorder.BorderBrush = Brushes.Gray;
            exampleBorder.BorderThickness = new Thickness(1);
            exampleBorder.HorizontalAlignment = HorizontalAlignment.Left;
            exampleBorder.VerticalAlignment = VerticalAlignment.Top;
            exampleBorder.Margin = new Thickness(10);

            this.Margin = new Thickness(20);
            this.Background = Brushes.White;
            this.Content = exampleBorder;
        }

    }
}
<Page 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:PresentationOptions="https://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="PresentationOptions"
  Background="White" Margin="20">

  <Border BorderBrush="Gray" BorderThickness="1" 
    HorizontalAlignment="Left" VerticalAlignment="Top"
    Margin="10">

    <!-- This image uses a Drawing object for its source. -->
    <Image>
      <Image.Source>
        <DrawingImage PresentationOptions:Freeze="True">
          <DrawingImage.Drawing>
            <GeometryDrawing>
              <GeometryDrawing.Geometry>
                <GeometryGroup>
                  <EllipseGeometry Center="50,50" RadiusX="45" RadiusY="20" />
                  <EllipseGeometry Center="50,50" RadiusX="20" RadiusY="45" />
                </GeometryGroup>
              </GeometryDrawing.Geometry>
              <GeometryDrawing.Brush>
                <LinearGradientBrush>
                  <GradientStop Offset="0.0" Color="Blue" />
                  <GradientStop Offset="1.0" Color="#CCCCFF" />
                </LinearGradientBrush>
              </GeometryDrawing.Brush>
              <GeometryDrawing.Pen>
                <Pen Thickness="10" Brush="Black" />
              </GeometryDrawing.Pen>
            </GeometryDrawing>
          </DrawingImage.Drawing>
        </DrawingImage>
      </Image.Source>
    </Image>
  </Border>

</Page>

Закраска объекта с помощью Drawing

DrawingBrush представляет собой тип кисти, которая закрашивает область объектом Drawing. Можно использовать его для закраски практически любого графического объекта рисунком Drawing. Свойство Drawing кисти DrawingBrush описывает ее Drawing. Для отображения Drawing с DrawingBrush добавьте его к кисти с помощью свойства кисти Drawing и используйте кисть для закраски графического объекта, например, элемента управления или панели.

В следующих примерах используется DrawingBrush для закраски Fill фигуры Rectangle шаблоном, созданным из GeometryDrawing. В результате выполнения примера получается следующий результат:

Использование GeometryDrawing с DrawingBrush
Мозаичная DrawingBrush

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

namespace SDKSample
{
    public class DrawingBrushExample : Page
    {

        public DrawingBrushExample()
        {

            //
            // Create the Geometry to draw.
            //
            GeometryGroup ellipses = new GeometryGroup();
            ellipses.Children.Add(
                new EllipseGeometry(new Point(50,50), 45, 20)
                );
            ellipses.Children.Add(
                new EllipseGeometry(new Point(50, 50), 20, 45)
                );

            //
            // Create a GeometryDrawing.
            //
            GeometryDrawing aGeometryDrawing = new GeometryDrawing();
            aGeometryDrawing.Geometry = ellipses;

            // Paint the drawing with a gradient.
            aGeometryDrawing.Brush = 
                new LinearGradientBrush(
                    Colors.Blue, 
                    Color.FromRgb(204,204,255), 
                    new Point(0,0), 
                    new Point(1,1));

            // Outline the drawing with a solid color.
            aGeometryDrawing.Pen = new Pen(Brushes.Black, 10);

            DrawingBrush patternBrush = new DrawingBrush(aGeometryDrawing);
            patternBrush.Viewport = new Rect(0, 0, 0.25, 0.25);
            patternBrush.TileMode = TileMode.Tile;
            patternBrush.Freeze();

            //
            // Create an object to paint.
            //
            Rectangle paintedRectangle = new Rectangle();
            paintedRectangle.Width = 100;
            paintedRectangle.Height = 100;
            paintedRectangle.Fill = patternBrush;

            //
            // Place the image inside a border and
            // add it to the page.
            //
            Border exampleBorder = new Border();
            exampleBorder.Child = paintedRectangle;
            exampleBorder.BorderBrush = Brushes.Gray;
            exampleBorder.BorderThickness = new Thickness(1);
            exampleBorder.HorizontalAlignment = HorizontalAlignment.Left;
            exampleBorder.VerticalAlignment = VerticalAlignment.Top;
            exampleBorder.Margin = new Thickness(10);

            this.Margin = new Thickness(20);
            this.Background = Brushes.White;
            this.Content = exampleBorder;
        }
    }
}
<Page 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:PresentationOptions="https://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="PresentationOptions"
  Margin="20" Background="White">

  <Border BorderBrush="Gray" BorderThickness="1" 
    HorizontalAlignment="Left" VerticalAlignment="Top"
    Margin="10">
    <Rectangle Width="100" Height="100">
      <Rectangle.Fill>
        <DrawingBrush PresentationOptions:Freeze="True"
                      Viewport="0,0,0.25,0.25" TileMode="Tile">
          <DrawingBrush.Drawing>
            <GeometryDrawing>
              <GeometryDrawing.Geometry>
                <GeometryGroup>
                  <EllipseGeometry Center="50,50" RadiusX="45" RadiusY="20" />
                  <EllipseGeometry Center="50,50" RadiusX="20" RadiusY="45" />
                </GeometryGroup>
              </GeometryDrawing.Geometry>
              <GeometryDrawing.Brush>
                <LinearGradientBrush>
                  <GradientStop Offset="0.0" Color="Blue" />
                  <GradientStop Offset="1.0" Color="#CCCCFF" />
                </LinearGradientBrush>
              </GeometryDrawing.Brush>
              <GeometryDrawing.Pen>
                <Pen Thickness="10" Brush="Black" />
              </GeometryDrawing.Pen>
            </GeometryDrawing>
          </DrawingBrush.Drawing>
        </DrawingBrush>
      </Rectangle.Fill>

    </Rectangle>
  </Border>


</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SDKSample
{
    public class DrawingBrushExample : Page
    {

        public DrawingBrushExample()
        {

            //
            // Create the Geometry to draw.
            //
            GeometryGroup ellipses = new GeometryGroup();
            ellipses.Children.Add(
                new EllipseGeometry(new Point(50,50), 45, 20)
                );
            ellipses.Children.Add(
                new EllipseGeometry(new Point(50, 50), 20, 45)
                );

            //
            // Create a GeometryDrawing.
            //
            GeometryDrawing aGeometryDrawing = new GeometryDrawing();
            aGeometryDrawing.Geometry = ellipses;

            // Paint the drawing with a gradient.
            aGeometryDrawing.Brush = 
                new LinearGradientBrush(
                    Colors.Blue, 
                    Color.FromRgb(204,204,255), 
                    new Point(0,0), 
                    new Point(1,1));

            // Outline the drawing with a solid color.
            aGeometryDrawing.Pen = new Pen(Brushes.Black, 10);

            DrawingBrush patternBrush = new DrawingBrush(aGeometryDrawing);
            patternBrush.Viewport = new Rect(0, 0, 0.25, 0.25);
            patternBrush.TileMode = TileMode.Tile;
            patternBrush.Freeze();

            //
            // Create an object to paint.
            //
            Rectangle paintedRectangle = new Rectangle();
            paintedRectangle.Width = 100;
            paintedRectangle.Height = 100;
            paintedRectangle.Fill = patternBrush;

            //
            // Place the image inside a border and
            // add it to the page.
            //
            Border exampleBorder = new Border();
            exampleBorder.Child = paintedRectangle;
            exampleBorder.BorderBrush = Brushes.Gray;
            exampleBorder.BorderThickness = new Thickness(1);
            exampleBorder.HorizontalAlignment = HorizontalAlignment.Left;
            exampleBorder.VerticalAlignment = VerticalAlignment.Top;
            exampleBorder.Margin = new Thickness(10);

            this.Margin = new Thickness(20);
            this.Background = Brushes.White;
            this.Content = exampleBorder;
        }
    }
}

Класс DrawingBrush предоставляет ряд параметров для растягивается и мозаичного заполнения его содержимого. Дополнительные сведения о DrawingBrush см. в обзоре Рисование с помощью объектов Image, Drawing и Visual.

Отображение Drawing с помощью Visual

DrawingVisual представляет собой тип объекта Visual, разработанный для отображения Drawing. Работа непосредственно на уровне Visual является параметром для разработчиков, которым требуется построить настраиваемую графическую среду; это не описано в данном обзоре. Дополнительные сведения см. в обзоре Использование объектов DrawingVisual.

Объекты DrawingContext

Класс DrawingContext позволяет заполнить Visual или Drawing содержимым Visual. Многие такие низкоуровневые графические объекты используют DrawingContext, так как он очень эффективно описывает графическое содержимое.

Хотя методы рисования DrawingContext кажутся похожими на методы рисования типа System.Drawing.Graphics, на самом деле они очень различаются. DrawingContext используется с графической системой режима сохранения, тогда как тип System.Drawing.Graphics используется с графической системой режима интерпретации. При использовании команд рисования объекта DrawingContext объекта фактически хранится набор инструкций отображения (хотя точный механизм хранения зависит от типа объекта, который предоставляет DrawingContext), которые будут позднее использованы графической системой; отрисовка не происходит в режиме реального времени. Дополнительные сведения о том, как работает графическая система WPF (Windows Presentation Foundation), см. в разделе Обзор графической визуализации Windows Presentation Foundation.

Нельзя непосредственно создать экземпляр DrawingContext; однако можно получить контекст рисования из определенных методов, таких как DrawingGroup.Open и DrawingVisual.RenderOpen.

Перечисление содержимого Visual

В дополнение к другим применениям, объекты Drawing также предоставляют объектную модель для перечисления содержимого объекта Visual.

В следующем примере метод GetDrawing используется для извлечения значения DrawingGroup объекта Visual и его перечисления.

public void RetrieveDrawing(Visual v)
{
    DrawingGroup dGroup = VisualTreeHelper.GetDrawing(v);
    EnumDrawingGroup(dGroup);

}

 // Enumerate the drawings in the DrawingGroup.
 public void EnumDrawingGroup(DrawingGroup drawingGroup)
 {
     DrawingCollection dc = drawingGroup.Children;

     // Enumerate the drawings in the DrawingCollection.
     foreach (Drawing drawing in dc)
     {
         // If the drawing is a DrawingGroup, call the function recursively.
         if (drawing.GetType() == typeof(DrawingGroup))
         {
             EnumDrawingGroup((DrawingGroup)drawing);
         }
         else if (drawing.GetType() == typeof(GeometryDrawing))
         {
             // Perform action based on drawing type.  
         }
         else if (drawing.GetType() == typeof(ImageDrawing))
         {
             // Perform action based on drawing type.
         }
         else if (drawing.GetType() == typeof(GlyphRunDrawing))
         {
             // Perform action based on drawing type.
         }
         else if (drawing.GetType() == typeof(VideoDrawing))
         {
             // Perform action based on drawing type.
         }
     }
 }

См. также

Основные понятия

Оптимизация производительности: двумерная графика и обработка изображений

Рисование с помощью объектов Image, Drawing и Visual

Общие сведения о классе Geometry

Обзор фигур и базовых средств рисования в приложении WPF

Обзор графической визуализации Windows Presentation Foundation

Общие сведения об объектах класса Freezable

Ссылки

Drawing

DrawingGroup

Другие ресурсы

Разделы руководства, посвященные изображениям