Přehled vykreslovaných objektů

Toto téma představuje Drawing objekty a popisuje, jak je používat k efektivnímu kreslení obrazců, rastrových obrázků, textu a médií. Objekty můžete použít Drawing při vytváření klipartů, malování pomocí objektu DrawingBrushnebo použití Visual objektů.

Co je nakreslený objekt

Objekt Drawing popisuje viditelný obsah, například obrazec, rastrový obrázek, video nebo řádek textu. Různé typy výkresů popisují různé typy obsahu. Následuje seznam různých typů nakreslených objektů.

Drawing objekty jsou všestranné; existuje mnoho způsobů, jak můžete objekt použít Drawing .

  • Můžete ho zobrazit jako obrázek pomocí DrawingImage ovládacího prvku a Image ovládacího prvku.

  • Můžete ho použít k DrawingBrush malování objektu, například Background objektu Page.

  • Můžete ho DrawingVisualpoužít k popisu vzhledu .

  • Můžete ho použít k vytvoření výčtu Visualobsahu souboru .

WPF poskytuje další typy objektů, které jsou schopné kreslit obrazce, rastrové obrázky, text a média. Objekty můžete například použít Shape také k kreslení obrazců a MediaElement ovládací prvek poskytuje další způsob, jak do aplikace přidat video. Kdy byste tedy měli použít Drawing objekty? Když můžete obětovat funkce na úrovni architektury, abyste získali výhody výkonu nebo když potřebujete Freezable funkce. Vzhledem k tomuDrawing, že objekty nemají podporu rozložení, vstupu a fokusu, poskytují výhody výkonu, díky kterým jsou ideální pro popis pozadí, klipartů a pro kreslení na nízké úrovni s Visual objekty.

Vzhledem k tomu, že se jedná o objekt typu Freezable , Drawing objekty získávají několik speciálních funkcí, které zahrnují následující: můžou být deklarovány jako prostředky sdílené mezi více objekty, aby se zlepšil výkon, klonování a ochrana vláken jen pro čtení. Další informace o různých funkcích poskytovaných Freezable objekty naleznete v části Mrazitelné objekty Přehled.

Kreslení obrazce

Chcete-li nakreslit obrazec, použijte .GeometryDrawing Vlastnost výkresu Geometry geometrie popisuje obrazec, který se má nakreslit, jeho Brush vlastnost popisuje, jak má být interiér obrazce malován, a jeho Pen vlastnost popisuje, jak má být nakreslen obrys.

Následující příklad používá GeometryDrawing k nakreslení obrazce. Obrazec je popsán dvěma GeometryGroupEllipseGeometry objekty. Interiér obrazce je malován LinearGradientBrush a jeho obrys je nakreslen s BlackPen.

Tento příklad vytvoří následující GeometryDrawing.

A GeometryDrawing of two ellipses
A 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>

Úplný příklad naleznete v tématu Vytvoření geometryDrawing.

Další Geometry třídy, například PathGeometry umožňují vytvářet složitější obrazce vytvořením křivek a oblouků. Další informace o Geometry objektech naleznete v přehledu geometrie.

Další informace o jiných způsobech kreslení obrazců, které nepoužívají Drawing objekty, naleznete v tématu Obrazce a základní výkres v přehledu WPF.

Kreslení obrázku

Pokud chcete nakreslit obrázek, použijte .ImageDrawing ImageDrawing Vlastnost objektu ImageSource popisuje obrázek, který se má nakreslit, a jeho Rect vlastnost definuje oblast, ve které je obrázek nakreslen.

Následující příklad nakreslí obrázek do obdélníku umístěného v 75 75, který je 100 × 100 pixelů. Následující obrázek znázorňuje ImageDrawing vytvořený v příkladu. Bylo přidáno šedé ohraničení, aby se zobrazily ImageDrawinghranice .

A 100 by 100 ImageDrawing drawn at (75,75)
A 100 od 100 ImageDrawing

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

Další informace o obrázcích najdete v přehledu imagí.

Přehrát médium (pouze kód)

Poznámka:

I když můžete deklarovat VideoDrawing jazyk XAML (Extensible Application Markup Language), můžete načíst a přehrát jeho médium pouze pomocí kódu. Pokud chcete přehrát video v jazyce XAML (Extensible Application Markup Language), použijte MediaElement místo toho.

K přehrání zvukového nebo videosouboru MediaPlayerpoužijete a VideoDrawing . Existují dva způsoby, jak načíst a přehrát multimédia. První je použít a MediaPlayer a sám, a druhý způsob je vytvořit vlastní MediaTimeline použití s a MediaPlayerVideoDrawing.VideoDrawing

Poznámka:

Při distribuci médií s aplikací nemůžete jako zdroj projektu použít multimediální soubor, jako byste použili obrázek. V souboru projektu musíte místo toho nastavit typ média na Content a nastavit CopyToOutputDirectory na PreserveNewest nebo Always.

Pokud chcete přehrávat multimédia bez vytváření vlastního MediaTimelinemédia, proveďte následující kroky.

  1. Vytvoření objektu MediaPlayer

    MediaPlayer player = new MediaPlayer();
    
  2. Open K načtení multimediálního souboru použijte metodu.

    player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
    
  3. Vytvoření souboru VideoDrawing.

    VideoDrawing aVideoDrawing = new VideoDrawing();
    
  4. Zadejte velikost a umístění, které chcete nakreslit médium nastavením Rect vlastnosti objektu VideoDrawing.

    aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
    
  5. Player Nastavte vlastnost vytvořeného objektu MediaPlayerVideoDrawing.

    aVideoDrawing.Player = player;
    
  6. Play Použijte metodu MediaPlayer spuštění přehrávání média.

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

Následující příklad používá VideoDrawing a a MediaPlayer k přehrání videosouboru jednou.

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

Pokud chcete získat další kontrolu nad časováním médií, použijte s MediaTimeline objekty MediaPlayer a VideoDrawing objekty. Umožňuje MediaTimeline určit, jestli se má video opakovat. Pokud chcete použít s MediaTimeline nástrojem VideoDrawing, proveďte následující kroky:

  1. Deklarujte MediaTimeline a nastavte jeho chování časování.

    // Create a MediaTimeline.
    MediaTimeline mTimeline =
        new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
    
    // Set the timeline to repeat.
    mTimeline.RepeatBehavior = RepeatBehavior.Forever;
    
  2. Vytvořte z MediaClock objektu MediaTimeline.

    // Create a clock from the MediaTimeline.
    MediaClock mClock = mTimeline.CreateClock();
    
  3. MediaPlayer Vytvořte a použijte k MediaClock nastavení jeho Clock vlastnosti.

    MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
    repeatingVideoDrawingPlayer.Clock = mClock;
    
  4. VideoDrawing Vytvořte a přiřaďte MediaPlayer vlastnost Player objektu VideoDrawing.

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

V následujícím příkladu MediaTimeline se k opakovanému přehrávání videa používá s MediaPlayer a a a 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;

Všimněte si, že pokud použijete MediaTimeline, použijete interaktivní ClockController vrácenou z Controller vlastnosti vlastnosti MediaClock k ovládání přehrávání médií místo interaktivních metod MediaPlayer.

Kreslení textu

Chcete-li nakreslit text, použijte a GlyphRunDrawingGlyphRun. Následující příklad používá GlyphRunDrawing k vykreslení textu "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>

A GlyphRun je objekt nízké úrovně určený pro použití s prezentacemi dokumentů s pevným formátem a scénáři tisku. Jednodušší způsob, jak nakreslit text na obrazovku, je použít nebo Label použít TextBlock. Další informace o GlyphRun, naleznete v úvodu do GlyphRun Objekt a Glyphs – přehled elementu .

Složené výkresy

A DrawingGroup umožňuje kombinovat více výkresů do jednoho složeného výkresu. Pomocí objektu DrawingGroupmůžete zkombinovat obrazce, obrázky a text do jednoho Drawing objektu.

Následující příklad používá DrawingGroup ke kombinování dvou GeometryDrawing objektů a objektu ImageDrawing . Tento příklad vytvoří následující výstup.

A DrawingGroup with multiple drawings
Složený výkres

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

A DrawingGroup také umožňuje použít neprůhledné masky, transformace, rastrové efekty a další operace s jeho obsahem. DrawingGroupoperace se použijí v následujícím pořadí: OpacityMask, Opacity, BitmapEffectClipGeometry, , GuidelineSeta pak Transform.

Následující obrázek znázorňuje pořadí, ve kterém DrawingGroup se používají operace.

DrawingGroup order of operations
Pořadí operací DrawingGroup

Následující tabulka popisuje vlastnosti, které můžete použít k manipulaci s obsahem DrawingGroup objektu.

Vlastnost Popis Ilustrace
OpacityMask Změní neprůhlednost vybraných DrawingGroup částí obsahu. Příklad: Řízení neprůhlednosti výkresu. A DrawingGroup with an opacity mask
Opacity Jednotně změní neprůhlednost DrawingGroup obsahu. Pomocí této vlastnosti můžete nastavit průhledný Drawing nebo částečně transparentní. Příklad najdete v tématu Postupy: Použití masky neprůhlednosti u výkresu. DrawingGroups with different opacity settings
BitmapEffect BitmapEffect Použije obsahDrawingGroup. Příklad: Použití BitmapEffect na výkres. DrawingGroup with a BlurBitmapEffect
ClipGeometry Vystřižuje DrawingGroup obsah do oblasti, kterou popisujete pomocí Geometry. Příklad: Vystřižování výkresu . DrawingGroup with a defined clip region
GuidelineSet Přichytí nezávislé pixely zařízení k pixelům zařízení podle zadaných pokynů. Tato vlastnost je užitečná pro zajištění, aby jemně detailní grafika vykreslována ostře na displejích s nízkým rozlišením DPI. Příklad najdete v tématu Použití sady zásad pro výkres. A DrawingGroup with and without a GuidelineSet
Transform Transformuje DrawingGroup obsah. Příklad: Použití transformace na výkres. A rotated DrawingGroup

Zobrazení výkresu jako obrázku

Chcete-li zobrazit Drawing ovládací prvek, Image použijte DrawingImage jako Image ovládací prvek Source a nastavte DrawingImage vlastnost objektu DrawingImage.Drawing na výkres, který chcete zobrazit.

Následující příklad používá DrawingImage a ovládací prvek Image k zobrazení GeometryDrawing. Tento příklad vytvoří následující výstup.

A GeometryDrawing of two ellipses
A 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>

Malování objekt s výkresem

A DrawingBrush je typ štětce, který maluje oblast nakresleným objektem. Můžete ho použít k vykreslení libovolného grafického objektu pomocí výkresu. Vlastnost Drawing objektu DrawingBrush popisuje jeho Drawing. Pokud chcete vykreslit objekt Drawing pomocí DrawingBrushštětce , přidejte ho do štětce pomocí vlastnosti štětce a pomocí štětce Drawing nakreslujte grafický objekt, například ovládací prvek nebo panel.

Následující příklady používají DrawingBrush k malování Fill vzoru Rectangle vytvořeného z objektu GeometryDrawing. Tento příklad vytvoří následující výstup.

A tiled DrawingBrush
GeometryDrawing používané s 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>

Třída DrawingBrush poskytuje řadu možností pro roztažení a provazování obsahu. Další informace o DrawingBrushnástroji Malování s přehledem obrázků, výkresů a vizuálů.

Vykreslení výkresu pomocí vizuálu

A DrawingVisual je typ vizuálního objektu navrženého k vykreslení výkresu. Práce přímo na vizuální vrstvě je možnost pro vývojáře, kteří chtějí vytvořit vysoce přizpůsobené grafické prostředí, a není popsáno v tomto přehledu. Další informace najdete v přehledu Použití objektů DrawingVisual.

DrawingContext – objekty

Třída DrawingContext umožňuje naplnit Visual vizuální obsah nebo jeho Drawing obsah. Mnoho takových grafických objektů nižší úrovně používá, DrawingContext protože popisuje grafický obsah velmi efektivně.

I když se DrawingContext metody kreslení zobrazují podobně jako metody System.Drawing.Graphics kreslení typu, jsou ve skutečnosti velmi odlišné. DrawingContext se používá s grafickým systémem v zachovaném režimu, zatímco System.Drawing.Graphics typ se používá s grafickým systémem okamžitého režimu. Když použijete DrawingContext příkazy kreslení objektu, ve skutečnosti ukládáte sadu pokynů pro vykreslování (i když přesný mechanismus úložiště závisí na typu objektu DrawingContext, který poskytuje ), který bude později používán grafickým systémem; nejste kreslili na obrazovku v reálném čase. Další informace o fungování grafického systému WINDOWS Presentation Foundation (WPF) naleznete v tématu Přehled vykreslování grafiky WPF.

Nikdy přímo vytvořit DrawingContextinstanci ; můžete však získat kontext výkresu z určitých metod, například DrawingGroup.Open a DrawingVisual.RenderOpen.

Zobrazení výčtu obsahu vizuálu

Kromě jejich jiných použití Drawing objekty také poskytují objektový model pro výčet obsahu objektu Visual.

Následující příklad používá metodu GetDrawing k načtení DrawingGroup hodnoty Visual a výčet.

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

Viz také