Compartilhar via


Visão geral de objetos de desenho

Este tópico apresenta Drawing objetos e descreve como usá-los para desenhar formas, bitmaps, texto e mídia com eficiência. Use Drawing objetos ao criar clipart, pintar com um DrawingBrush ou usar Visual objetos.

O que é um objeto de desenho

Um objeto Drawing descreve o conteúdo visível, como uma forma, bitmap, vídeo ou uma linha de texto. Diferentes tipos de desenhos descrevem diferentes tipos de conteúdo. Veja a seguir uma lista dos diferentes tipos de objetos de desenho.

Drawing os objetos são versáteis; há várias maneiras de usar um Drawing objeto.

O WPF fornece outros tipos de objetos que são capazes de desenhar formas, bitmaps, texto e mídia. Por exemplo, você também pode usar Shape objetos para desenhar formas e o MediaElement controle fornece outra maneira de adicionar vídeo ao seu aplicativo. Então, quando você deve usar Drawing objetos? Quando você pode sacrificar recursos de nível de estrutura para obter benefícios de desempenho ou quando precisar de Freezable recursos. Como Drawing os objetos não têm suporte para Layout, entrada e foco, eles fornecem benefícios de desempenho que os tornam ideais para descrever planos de fundo, clip-art e desenho de baixo nível com Visual objetos.

Como eles são um objeto de tipo Freezable , Drawing os objetos ganham vários recursos especiais, que incluem o seguinte: eles podem ser declarados como recursos, compartilhados entre vários objetos, feitos somente leitura para melhorar o desempenho, clonados e tornados thread-safe. Para obter mais informações sobre os diferentes recursos fornecidos pelos Freezable objetos, consulte a Visão geral dos objetos freezable.

Desenhar uma forma

Para desenhar uma forma, use um GeometryDrawing. A propriedade de um desenho de Geometry geometria descreve a forma a ser desenhada, sua propriedade Brush descreve como o interior da forma deve ser pintado e sua propriedade Pen descreve como seu contorno deve ser desenhado.

O exemplo a seguir usa um GeometryDrawing para desenhar uma forma. A forma é descrita por um GeometryGroup e dois EllipseGeometry objetos. O interior da forma é pintado com um LinearGradientBrush e seu contorno é desenhado com um BlackPen.

Este exemplo cria o seguinte GeometryDrawing.

Um GeometryDrawing de duas elipses
Um Desenho Geométrico

//
// 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>

Para obter o exemplo completo, consulte Criar GeometryDrawing.

Outras Geometry classes, como PathGeometry permitir que você crie formas mais complexas criando curvas e arcos. Para obter mais informações sobre Geometry objetos, consulte a Visão Geral da Geometria.

Para obter mais informações sobre outras maneiras de desenhar formas que não usam Drawing objetos, consulte Formas e Desenho Básico na Visão Geral do WPF.

Desenhar uma imagem

Para desenhar uma imagem, use um ImageDrawing. A propriedade de ImageDrawing um ImageSource objeto descreve a imagem a ser desenhada e sua Rect propriedade define a região em que a imagem é desenhada.

O exemplo a seguir desenha uma imagem em um retângulo localizado em (75,75) que tem 100 por 100 pixels. A ilustração a seguir mostra o ImageDrawing criado pelo exemplo. Uma borda cinza foi adicionada para mostrar os limites do ImageDrawing.

Um ImageDrawing 100 por 100 desenhado em (75,75)
Um ImageDrawing 100 por 100

// 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"/>

Para obter mais informações sobre imagens, consulte a Visão Geral de Imagens.

Reproduzir mídia (apenas código)

Observação

Embora você possa declarar um VideoDrawing em XAML, só é possível carregar e reproduzir sua mídia usando código. Em vez disso, use um MediaElement para reproduzir vídeo na Extensible Application Markup Language (XAML).

Para reproduzir um arquivo de áudio ou vídeo, use um VideoDrawing e um MediaPlayer. Há duas maneiras de carregar e reproduzir mídia. A primeira é usar um MediaPlayer e um VideoDrawing sozinhos, e a segunda maneira é criar sua própria MediaTimeline para usar com o MediaPlayer e VideoDrawing.

Observação

Ao distribuir mídia com seu aplicativo, você não pode usar um arquivo de mídia como um recurso de projeto, como faria com uma imagem. Em seu arquivo de projeto, em vez disso, você deve definir o tipo de mídia como Content e defina CopyToOutputDirectory para PreserveNewest ou Always.

Para reproduzir mídia sem criar sua própria MediaTimeline, execute os seguintes passos.

  1. Crie um objeto MediaPlayer.

    MediaPlayer player = new MediaPlayer();
    
  2. Use o Open método para carregar o arquivo de mídia.

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

    VideoDrawing aVideoDrawing = new VideoDrawing();
    
  4. Especifique o tamanho e o local para desenhar a mídia definindo a Rect propriedade do VideoDrawing.

    aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
    
  5. Defina a propriedade Player do VideoDrawing com o MediaPlayer que você criou.

    aVideoDrawing.Player = player;
    
  6. Para começar a reproduzir a mídia, use o Play método do MediaPlayer.

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

O exemplo a seguir usa um VideoDrawing e um MediaPlayer para reproduzir um arquivo de vídeo uma vez.

//
// 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();

Para obter controle de tempo adicional sobre a mídia, use um MediaTimeline com os objetos MediaPlayer e VideoDrawing. O MediaTimeline permite que você especifique se o vídeo deve ser repetido. Para usar um MediaTimeline com um VideoDrawing, execute as seguintes etapas:

  1. Declare o MediaTimeline e defina seus comportamentos de tempo.

    // Create a MediaTimeline.
    MediaTimeline mTimeline =
        new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
    
    // Set the timeline to repeat.
    mTimeline.RepeatBehavior = RepeatBehavior.Forever;
    
  2. Crie um MediaClock a partir do MediaTimeline.

    // Create a clock from the MediaTimeline.
    MediaClock mClock = mTimeline.CreateClock();
    
  3. Crie um MediaPlayer e use o MediaClock para definir sua propriedade Clock.

    MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
    repeatingVideoDrawingPlayer.Clock = mClock;
    
  4. Crie um VideoDrawing e atribua o MediaPlayer à propriedade Player do VideoDrawing.

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

O exemplo a seguir usa um MediaTimeline com MediaPlayer e um VideoDrawing para reproduzir um vídeo repetidamente.

//
// 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;

Note que, quando você usa um MediaTimeline, está utilizando o ClockController interativo retornado da propriedade Controller do MediaClock para controlar a reprodução de mídia, em vez dos métodos interativos de MediaPlayer.

Desenhar Texto

Para desenhar texto, você usa um GlyphRunDrawing e um GlyphRun. O exemplo a seguir usa um GlyphRunDrawing para desenhar o texto "Olá, Mundo".

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>

Um GlyphRun é um objeto de baixo nível destinado a ser usado com cenários de impressão e apresentação de documento de formato fixo. Uma maneira mais simples de desenhar texto para a tela é usar um Label ou um TextBlock. Para obter mais informações sobre GlyphRun, consulte a introdução ao objeto GlyphRun e à visão geral do elemento Glyphs .

Desenhos compostos

Um DrawingGroup permite que você combine vários desenhos em um único desenho composto. Usando um DrawingGroup, você pode combinar formas, imagens e texto em um único Drawing objeto.

O exemplo a seguir usa um DrawingGroup para combinar dois GeometryDrawing objetos e um ImageDrawing objeto. Este exemplo gerencia a saída a seguir.

Um DrawingGroup com vários desenhos
Um desenho composto

//
// 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>

Um DrawingGroup também permite aplicar máscaras de opacidade, transformações, efeitos de bitmap e outras operações ao seu conteúdo. DrawingGroup as operações são aplicadas na seguinte ordem: OpacityMask, , Opacity, BitmapEffect, ClipGeometry, GuidelineSete depois Transform.

A ilustração a seguir mostra a ordem na qual DrawingGroup as operações são aplicadas.

Ordem de operações do DrawingGroup
Ordem das operações do DrawingGroup

A tabela a seguir descreve as propriedades que você pode usar para manipular o conteúdo de um DrawingGroup objeto.

Propriedade Descrição Ilustração
OpacityMask Altera a opacidade das partes selecionadas do DrawingGroup conteúdo. Para obter um exemplo, consulte Como controlar a opacidade de um desenho. Um DrawingGroup com uma máscara de opacidade
Opacity Altera uniformemente a opacidade dos DrawingGroup conteúdos. Use essa propriedade para tornar transparente Drawing ou parcialmente transparente. Para obter um exemplo, consulte Como aplicar uma máscara de opacidade a um desenho. DrawingGroups com configurações de opacidade diferentes
BitmapEffect Aplica-se a BitmapEffect um DrawingGroup conteúdo. Para obter um exemplo, consulte Como aplicar um BitmapEffect a um desenho. DrawingGroup com um BlurBitmapEffect
ClipGeometry Recorta o conteúdo do DrawingGroup para uma região que você define com um Geometry. Para obter um exemplo, consulte Como recortar um desenho . DrawingGroup com uma região de clipe definida
GuidelineSet Alinha pixels independentes do dispositivo aos pixels do dispositivo de acordo com as diretrizes especificadas. Essa propriedade é útil para garantir que elementos gráficos detalhados sejam renderizados de forma acentuada em exibições de baixa DPI. Para obter um exemplo, consulte Aplicar um Conjunto de Diretrizes a um Desenho. Um DrawingGroup com e sem um GuidelineSet
Transform Transforma o DrawingGroup conteúdo. Para obter um exemplo, consulte Como aplicar uma transformação a um desenho. Um DrawingGroup rotacionado

Exibir um desenho como uma imagem

Para exibir um Drawing com um controle Image, use um DrawingImage como o Image do controle Source e defina a propriedade DrawingImage do objeto DrawingImage.Drawing para o desenho que você deseja exibir.

O exemplo a seguir usa um DrawingImage e um controle Image para exibir um GeometryDrawing. Este exemplo gerencia a saída a seguir.

Um GeometryDrawing de duas elipses
Uma Imagem de Desenho

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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="http://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>

Pintar um objeto com um desenho

Um DrawingBrush é um tipo de pincel que pinta uma área com um objeto de desenho. Você pode usá-lo para pintar praticamente qualquer objeto gráfico com um desenho. A propriedade Drawing de DrawingBrush descreve sua Drawing. Para renderizar um Drawing com um DrawingBrush, adicione-o ao pincel usando a propriedade Drawing do pincel e use o pincel para pintar um objeto gráfico, como um controle ou painel.

Os exemplos a seguir usam um DrawingBrush para pintar o Fill de um Rectangle com um padrão criado a partir de um GeometryDrawing. Este exemplo gerencia a saída a seguir.

Um graphicsmm_drawingbrush_geometrydrawing DrawingBrush em blocos
Um GeometryDrawing usado com um 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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="http://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>

A classe DrawingBrush fornece uma variedade de opções para esticar e distribuir seu conteúdo. Para obter mais informações sobre DrawingBrush, consulte a visão geral de Pintura com Imagens, Desenhos e Visuais.

Renderizar um desenho com um visual

Um DrawingVisual é um tipo de objeto visual projetado para renderizar um desenho. Trabalhar diretamente na camada visual é uma opção para desenvolvedores que desejam criar um ambiente gráfico altamente personalizado e não é descrito nesta visão geral. Para obter mais informações, consulte a visão geral sobre uso de objetos DrawingVisual.

Objetos DrawingContext

A DrawingContext classe permite que você preencha um Visual ou um Drawing com conteúdo visual. Muitos desses objetos gráficos de nível inferior usam um DrawingContext porque ele descreve o conteúdo gráfico com muita eficiência.

Embora os DrawingContext métodos de desenho pareçam semelhantes aos métodos de desenho do System.Drawing.Graphics tipo, eles são realmente muito diferentes. DrawingContext é usado com um sistema gráfico em modo retido, enquanto o tipo System.Drawing.Graphics é usado com um sistema gráfico em modo imediato. Ao usar os comandos de desenho de um DrawingContext objeto, você está armazenando um conjunto de instruções de renderização (embora o mecanismo de armazenamento exato dependa do tipo de objeto que fornece o DrawingContext) que posteriormente será usado pelo sistema gráfico; você não está desenhando para a tela em tempo real. Para obter mais informações sobre como o sistema gráfico WPF (Windows Presentation Foundation) funciona, consulte a Visão geral da renderização de gráficos do WPF.

Você nunca instancia diretamente um DrawingContext; no entanto, você pode obter um contexto de desenho de determinados métodos, como DrawingGroup.Open e DrawingVisual.RenderOpen.

Enumerar o conteúdo de um visual

Além de seus outros usos, objetos Drawing também fornecem um modelo de objetos para enumerar o conteúdo de um Visual.

O exemplo a seguir usa o método GetDrawing para recuperar o valor DrawingGroup de um Visual e enumerá-lo.

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

// 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 is DrawingGroup group)
        {
            EnumDrawingGroup(group);
        }
        else if (drawing is GeometryDrawing)
        {
            // Perform action based on drawing type.
        }
        else if (drawing is ImageDrawing)
        {
            // Perform action based on drawing type.
        }
        else if (drawing is GlyphRunDrawing)
        {
            // Perform action based on drawing type.
        }
        else if (drawing is VideoDrawing)
        {
            // Perform action based on drawing type.
        }
    }
}

Consulte também