Freigeben über


Zeichnen von Objekten: Übersicht

In diesem Thema werden Drawing Objekte vorgestellt und beschrieben, wie sie zum effizienten Zeichnen von Formen, Bitmaps, Text und Medien verwendet werden. Verwenden Sie Drawing Objekte, wenn Sie ClipArt erstellen, mit einem DrawingBrush zeichnen oder Visual Objekte verwenden.

Was ist ein Zeichnungsobjekt?

Ein Drawing-Objekt beschreibt sichtbaren Inhalt, z. B. eine Form, eine Bitmap, ein Video oder eine Textzeile. Verschiedene Arten von Zeichnungen beschreiben unterschiedliche Arten von Inhalten. Es folgt eine Liste der verschiedenen Arten von Zeichnungsobjekten.

  • GeometryDrawing – Zeichnet eine Form.

  • ImageDrawing – Zeichnet ein Bild.

  • GlyphRunDrawing – Zeichnet Text.

  • VideoDrawing – Gibt eine Audio- oder Videodatei wieder.

  • DrawingGroup – Zeichnet andere Zeichnungen. Verwenden Sie eine Zeichnungsgruppe, um andere Zeichnungen in einer einzigen zusammengesetzten Zeichnung zu kombinieren.

Drawing Objekte sind vielseitig; Es gibt viele Möglichkeiten, ein Drawing Objekt zu verwenden.

  • Sie können es als Bild mithilfe eines DrawingImage- und eines Image-Steuerelements anzeigen.

  • Sie können es mit einer DrawingBrush verwenden, um ein Objekt anzumalen, z. B. das Background eines Page.

  • Sie können es verwenden, um das Erscheinungsbild eines DrawingVisual zu beschreiben.

  • Sie können es verwenden, um den Inhalt eines Visual aufzulisten.

WPF stellt andere Objekttypen bereit, die Zeichnungen von Formen, Bitmaps, Text und Medien ermöglichen. Sie können beispielsweise auch Objekte verwenden Shape , um Formen zu zeichnen, und das MediaElement Steuerelement bietet eine weitere Möglichkeit, Ihrer Anwendung Video hinzuzufügen. Wann sollten Sie also Objekte verwenden Drawing ? Wenn Sie Funktionen auf Framework-Ebene opfern können, um Leistungsvorteile zu erzielen, oder wenn Sie Freezable Funktionen benötigen. Da Drawing Objekte keine Unterstützung für Layout, Eingabe und Fokus bieten, bieten sie Leistungsvorteile, die sie ideal für die Beschreibung von Hintergründen, ClipArt und für die Zeichnung mit Visual Objekten auf niedriger Ebene machen.

Da es sich um ein Typobjekt Freezable handelt, Drawing erhalten Objekte mehrere spezielle Features, die Folgendes umfassen: Sie können als Ressourcen deklariert werden, die von mehreren Objekten gemeinsam genutzt werden, schreibgeschützt gemacht werden, um die Leistung zu verbessern, geklont und threadsicher zu machen. Weitere Informationen zu den verschiedenen Features, die von Freezable Objekten bereitgestellt werden, finden Sie in der Übersicht über Freezable Objects.

Zeichnen einer Form

Zum Zeichnen einer Form verwenden Sie eine GeometryDrawing. Die Eigenschaft einer geometrischen Zeichnung Geometry beschreibt die zu zeichnende Form, ihre Brush Eigenschaft beschreibt, wie das Innere der Form bemalt werden soll, und ihre Pen Eigenschaft beschreibt, wie die Kontur gezeichnet werden soll.

Im folgenden Beispiel wird ein GeometryDrawing verwendet, um eine Form zu zeichnen. Die Form wird durch ein GeometryGroup und zwei EllipseGeometry Objekte beschrieben. Das Innere der Form wird mit einer LinearGradientBrush bemalt und seine Kontur wird mit einem BlackPen gezeichnet.

In diesem Beispiel wird folgendes GeometryDrawingerstellt.

GeometryDrawing von zwei Ellipsen
Ein GeometryDrawing-Element

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

Das vollständige Beispiel finden Sie unter Create a GeometryDrawing.

Andere Geometry Klassen, z PathGeometry . B. ermöglichen es Ihnen, komplexere Formen zu erstellen, indem Sie Kurven und Bögen erstellen. Weitere Informationen zu Geometry Objekten finden Sie unter "Geometry Overview".

Weitere Informationen zu anderen Methoden zum Zeichnen von Shapes, die keine Objekte verwenden Drawing , finden Sie unter "Shapes" und "Standardzeichnung" in WPF (Übersicht).

Zeichnen eines Bilds

Zum Zeichnen eines Bilds verwenden Sie eine ImageDrawing. Die Eigenschaft eines ImageDrawing Objekts ImageSource beschreibt das zu zeichnende Bild, und seine Rect Eigenschaft definiert den Bereich, in dem das Bild gezeichnet wird.

Im folgenden Beispiel wird ein Bild in ein Rechteck geschnitten, das sich auf (75.75) befindet, das 100 x 100 Pixel beträgt. Die folgende Abbildung zeigt das vom Beispiel erstellte ImageDrawing. Es wurde ein grauer Rahmen hinzugefügt, um die Bereiche der ImageDrawing zu kennzeichnen.

Ein 100 mal 100 ImageDrawing-Objekt, das an Position (75,75) gezeichnet wurde
Ein 100 mal 100 Bildzeichnung

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

Weitere Informationen zu Bildern finden Sie unter " Imaging Overview".

Medien abspielen (nur Code)

Hinweis

Obwohl Sie eine VideoDrawing in Extensible Application Markup Language (XAML) deklarieren können, können Sie dessen Medien nur mit Code laden und wiedergeben. Um Video in XAML (Extensible Application Markup Language) wiederzugeben, verwenden Sie stattdessen eine MediaElement .

Zum Wiedergeben einer Audio- oder Videodatei verwenden Sie eine VideoDrawing und einen MediaPlayer. Es gibt zwei Möglichkeiten zum Laden und Wiedergeben von Medien. Zuerst verwenden Sie selbst MediaPlayer und VideoDrawing selbstständig, und die zweite Methode besteht im Erstellen einer eigenen MediaTimeline für die Verwendung mit dem MediaPlayer und der VideoDrawing.

Hinweis

Wenn Sie Medien mit Ihrer Anwendung verteilen, können Sie eine Mediendatei nicht wie ein Bild als Projektressource verwenden. In der Projektdatei müssen Sie stattdessen den Medientyp auf Content festlegen und CopyToOutputDirectory auf PreserveNewest oder Alwaysfestlegen.

Führen Sie die folgenden Schritte aus, um Medien wiederzugeben, ohne ein eigenes MediaTimeline zu erstellen.

  1. Erstellen eines MediaPlayer-Objekts

    MediaPlayer player = new MediaPlayer();
    
  2. Verwenden Sie die Open Methode, um die Mediendatei zu laden.

    player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
    
  3. Erstellen Sie eine VideoDrawing.

    VideoDrawing aVideoDrawing = new VideoDrawing();
    
  4. Geben Sie die Größe und Position an, indem Sie die Eigenschaft des Rect der VideoDrawing festlegen, um die Medien darzustellen.

    aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
    
  5. Legen Sie die Eigenschaft Player des Objekts VideoDrawing fest, das Sie mit MediaPlayer erstellt haben.

    aVideoDrawing.Player = player;
    
  6. Verwenden Sie die Play Methode des MediaPlayer, um mit der Medienwiedergabe zu beginnen.

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

Im folgenden Beispiel wird ein VideoDrawing und ein MediaPlayer verwendet, um eine Videodatei einmal wiederzugeben.

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

Wenn Sie zusätzliche zeitliche Kontrolle über die Medienwiedergabe erlangen möchten, verwenden Sie eine MediaTimeline mit den Objekten MediaPlayer und VideoDrawing. Mit dem MediaTimeline können Sie angeben, ob das Video wiederholt werden soll. Um ein MediaTimeline mit einem VideoDrawing zu verwenden, führen Sie die folgenden Schritte aus:

  1. Deklarieren Sie das MediaTimeline und legen Sie sein Zeitverhalten fest.

    // Create a MediaTimeline.
    MediaTimeline mTimeline =
        new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
    
    // Set the timeline to repeat.
    mTimeline.RepeatBehavior = RepeatBehavior.Forever;
    
  2. Erstellen Sie eine MediaClock aus der MediaTimeline.

    // Create a clock from the MediaTimeline.
    MediaClock mClock = mTimeline.CreateClock();
    
  3. Erstellen Sie ein MediaPlayer und verwenden Sie das MediaClock, um seine Clock-Eigenschaft festzulegen.

    MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
    repeatingVideoDrawingPlayer.Clock = mClock;
    
  4. Erstellen Sie ein VideoDrawing und weisen Sie dem MediaPlayer die Player-Eigenschaft von VideoDrawing zu.

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

Im folgenden Beispiel wird ein MediaTimeline mit einem MediaPlayer und einem VideoDrawing verwendet, um ein Video wiederholt abzuspielen.

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

Beachten Sie, dass Sie beim Verwenden einer MediaTimeline den interaktiven ClockController zum Steuern der Medienwiedergabe verwenden, der von der Controller-Eigenschaft der MediaClock zurückgegeben wird, anstelle der interaktiven Methoden von MediaPlayer.

Zeichnen von Text

Zum Zeichnen von Text verwenden Sie eine GlyphRunDrawing und eine GlyphRun. Im folgenden Beispiel wird mit einem GlyphRunDrawing der Text "Hello World" gezeichnet.

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>

A GlyphRun ist ein Objekt auf niedriger Ebene, das für die Verwendung in Dokumentpräsentations- und Druckszenarien mit festem Format vorgesehen ist. Eine einfachere Möglichkeit zum Zeichnen von Text auf dem Bildschirm ist die Verwendung eines Label oder eines TextBlock. Weitere Informationen GlyphRunfinden Sie in der Übersicht über das GlyphRun-Objekt und das Glyphen-Element .

Zusammengesetzte Zeichnungen

Mit DrawingGroup dieser Option können Sie mehrere Zeichnungen in einer einzigen zusammengesetzten Zeichnung kombinieren. Mithilfe eines DrawingGroup, können Sie Formen, Bilder und Text in einem einzelnen Drawing Objekt kombinieren.

Im folgenden Beispiel wird DrawingGroup verwendet, um zwei GeometryDrawing Objekte und ein ImageDrawing Objekt zu kombinieren. Folgende Ergebnisse werden von diesem Beispiel zurückgegeben.

Eine DrawingGroup mit mehreren Zeichnungen
Eine zusammengesetzte Zeichnung

//
// 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 ermöglicht es Ihnen, Deckkraftmasken, Transformationen, Bitmapeffekte und andere Vorgänge auf den Inhalt anzuwenden. DrawingGroup Vorgänge werden in der folgenden Reihenfolge angewendet: OpacityMask, , Opacity, BitmapEffect, ClipGeometry, GuidelineSet, und dann Transform.

Die folgende Abbildung zeigt die Reihenfolge, in der DrawingGroup Vorgänge angewendet werden.

DrawingGroup-Reihenfolge der Vorgänge
Reihenfolge der DrawingGroup-Vorgänge

In der folgenden Tabelle werden die Eigenschaften beschrieben, mit denen Sie den Inhalt eines DrawingGroup Objekts bearbeiten können.

Eigentum BESCHREIBUNG Abbildung
OpacityMask Ändert die Deckkraft ausgewählter Teile des DrawingGroup Inhalts. Ein Beispiel finden Sie unter How to: Control the Opacity of a Drawing. Eine DrawingGroup mit einer Deckkraftmaske
Opacity Die Deckkraft der DrawingGroup Inhalte wird einheitlich geändert. Verwenden Sie diese Eigenschaft, um ein Drawing transparent oder teilweise transparent zu machen. Ein Beispiel finden Sie unter How to: Apply an Opacity Mask to a Drawing. DrawingGroups mit unterschiedlichen Deckkrafteinstellungen
BitmapEffect Wendet einen BitmapEffect auf den DrawingGroup Inhalt an. Ein Beispiel finden Sie unter So wenden Sie einen BitmapEffekt auf eine Zeichnung an. Zeichengruppe mit einem Weichzeichner-Bitmap-Effekt graphicsmm_bitmap
ClipGeometry Kürzt den Inhalt von DrawingGroup auf eine Region, die Sie mit Geometry beschreiben. Ein Beispiel finden Sie unter How to: Clip a Drawing . DrawingGroup mit einem definierten Clipbereich
GuidelineSet Fängt geräteunabhängige Pixel nach den angegebenen Richtlinien auf Gerätepixel ein. Diese Eigenschaft ist nützlich, um sicherzustellen, dass fein detaillierte Grafiken auf Displays mit geringem DPI-Wert scharf dargestellt werden. Ein Beispiel finden Sie unter Anwenden eines Richtliniensets auf eine Zeichnung. Eine DrawingGroup mit und ohne ein GuidelineSet
Transform Verändert den DrawingGroup Inhalt. Ein Beispiel finden Sie unter So wenden Sie eine Transformation auf eine Zeichnung an. Eine gedrehte ZeichenGruppe

Anzeigen einer Zeichnung als Bild

Um eine Drawing mit einem Image-Steuerelement anzuzeigen, verwenden Sie ein DrawingImage als Image des Source-Steuerelements, und legen Sie die DrawingImage-Eigenschaft des DrawingImage.Drawing-Objekts auf die Zeichnung fest, die Sie anzeigen möchten.

Im folgenden Beispiel werden ein DrawingImage und ein Image-Steuerelement verwendet, um eine GeometryDrawing anzuzeigen. Folgende Ergebnisse werden von diesem Beispiel zurückgegeben.

GeometryDrawing von zwei Ellipsen
DrawingImage

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>

Ein Objekt mit einer Zeichnung malen

A DrawingBrush ist ein Pinseltyp, der einen Bereich mit einem Zeichnungsobjekt zeichnet. Sie können es verwenden, um fast jedes grafische Objekt mit einer Zeichnung zu zeichnen. Die Drawing Eigenschaft eines Objekts DrawingBrush beschreibt seine Drawing. Zum Rendern eines Drawing mit einem DrawingBrush-Pinsel fügen Sie es mithilfe der Drawing-Eigenschaft des Pinsels hinzu und verwenden Sie den Pinsel, um ein grafisches Objekt zu zeichnen, z. B. ein Steuerelement oder ein Panel-Element.

Im folgenden Beispiel wird ein DrawingBrush verwendet, um das Fill eines Rectangle mit einem aus einem GeometryDrawing erstellten Muster zu malen. Folgende Ergebnisse werden von diesem Beispiel zurückgegeben.

Ein kachelartiger DrawingBrush: graphicsmm_drawingbrush_geometrydrawing
Ein GeometryDrawing, das mit einem DrawingBrush verwendet wird

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>

Die DrawingBrush Klasse bietet eine Vielzahl von Optionen, um ihren Inhalt zu strecken und zu kacheln. Weitere Informationen finden Sie in der Übersicht DrawingBrush über das Malen mit Bildern, Zeichnungen und visuellen Darstellungen.

Rendern einer Zeichnung mit einer Visualisierung

A DrawingVisual ist eine Art visuelles Objekt, das zum Rendern einer Zeichnung entwickelt wurde. Die direkte Arbeit auf der visuellen Ebene ist eine Option für Entwickler, die eine hochgradig angepasste grafische Umgebung erstellen möchten und in dieser Übersicht nicht beschrieben werden. Weitere Informationen finden Sie in der Übersicht über die Verwendung von DrawingVisual-Objekten.

DrawingContext-Objekte

Mit der DrawingContext Klasse können Sie einen Visual oder einen Drawing mit visuellem Inhalt auffüllen. Viele solche Grafikobjekte auf niedrigerer Ebene verwenden eine DrawingContext , da sie grafische Inhalte sehr effizient beschreibt.

Obwohl die DrawingContext draw-Methoden den draw-Methoden des System.Drawing.Graphics Typs ähnlich zu sein scheinen, sind sie tatsächlich sehr unterschiedlich. DrawingContext wird mit einem Grafiksystem im Retained-Modus verwendet, während der System.Drawing.Graphics-Typ mit einem Grafiksystem im Immediate-Modus verwendet wird. Wenn Sie die Draw-Befehle eines DrawingContext Objekts verwenden, speichern Sie tatsächlich eine Reihe von Renderinganweisungen (obwohl der genaue Speichermechanismus vom Typ des Objekts abhängt, das DrawingContext bereitstellt). Sie zeichnen dabei nicht in Echtzeit auf den Bildschirm. Weitere Informationen zur Funktionsweise des Windows Presentation Foundation (WPF)-Grafiksystems finden Sie in der Übersicht über das WPF-Grafikrendering.

Sie instanziieren niemals direkt ein DrawingContext. Sie können jedoch einen Zeichnungskontext aus bestimmten Methoden erwerben, wie z. B. DrawingGroup.Open und DrawingVisual.RenderOpen.

Aufzählen des Inhalts eines visuellen Elements

Zusätzlich zu ihren anderen Verwendungen stellen Drawing Objekte auch ein Objektmodell zum Aufzählen des Inhalts eines Containers Visual bereit.

Im folgenden Beispiel wird die GetDrawing Methode verwendet, um den DrawingGroup Wert eines Visual abzurufen und ihn aufzulisten.

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.
        }
    }
}

Siehe auch