请单击以进行评分并提供反馈
MSDN
MSDN Library
.NET 开发
.NET Framework
图形
绘图
 Drawing 对象概述
全部折叠/全部展开 全部折叠
此页面仅适用于
Microsoft Visual Studio 2008/.NET Framework 3.5

同时提供下列产品的其他版本:
Windows Presentation Foundation
Drawing 对象概述

更新:2007 年 11 月

本主题介绍 Drawing 对象,并说明如何使用它们来有效地绘制形状、位图、文本和媒体。创建剪贴画、使用 DrawingBrush 绘图或者使用 Visual 对象时,可以使用 Drawing 对象。

本主题包括下列各节。

Drawing 对象描述一些可见内容,例如形状、位图、视频或一行文本。不同类型的 Drawing 描绘的是不同类型的内容。下面列出了不同类型的 Drawing 对象。

Drawing 是一个通用对象;您可以通过多种方式使用 Drawing 对象。

WPF 提供了其他类型的对象,这些对象能够绘制形状、位图、文本和媒体。例如,您也可以使用 Shape 对象绘制形状,MediaElement 控件提供了将视频添加到应用程序中的另一种方式。那么,什么时候应使用 Drawing 对象?当可以牺牲框架级别功能以获取性能优势或需要 Freezable 功能时。由于 Drawing 对象缺少对布局系统、输入和焦点的支持,因此它们具有性能优势,是描述背景、剪贴画以及使用 Visual 对象进行低级绘制的理想选择。

由于 Drawing 对象是一种类型为 Freezable 的对象,因此它们具有若干特殊功能,其中包括可声明为资源、可在多个对象之间共享、可设为只读以提高性能、可进行克隆以及可设为线程安全对象。有关 Freezable 对象提供的不同功能的更多信息,请参见 Freezable 对象概述

您可以使用 GeometryDrawing 来绘制形状。几何绘图的 Geometry 属性描述要绘制的形状,其 Brush 属性描述形状内部的绘制方式,其 Pen 属性描述其轮廓的绘制方式。

下面的示例使用 GeometryDrawing 绘制形状。该形状由 GeometryGroup 和两个 EllipseGeometry 对象进行描述。形状内部使用 LinearGradientBrush 进行绘制,其轮廓则使用 Black Pen 进行绘制。

本示例创建以下 GeometryDrawing

GeometryDrawing

两个椭圆的 GeometryDrawing
C#
//
// 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);
XAML
<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 绘制图像。ImageDrawing 对象的 ImageSource 属性描述要绘制的图像,其 Rect 属性定义绘制图像的区域。

下面的示例将在一个矩形的 (75,75) 处绘制一个大小为 100 x 100 像素的图像。下面的插图显示在示例中创建的 ImageDrawing。添加了一条灰色边框,以显示 ImageDrawing 的边界。

大小为 100 x 100 的 ImageDrawing

在 (75,75) 处绘制的 100 x 100 ImageDrawing
C#
// 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));
XAML
<!-- 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"/>

有关图像的更多信息,请参见图像处理概述

说明:

虽然您可以在可扩展应用程序标记语言 (XAML) 中声明 VideoDrawing,但是只能使用代码加载并播放其媒体。若要在可扩展应用程序标记语言 (XAML) 中播放视频,请改用 MediaElement

您可以使用 VideoDrawingMediaPlayer 来播放音频或视频文件。加载并播放媒体的方法有两种。第一种方法是使用 MediaPlayerVideoDrawing 自身,第二种方法是创建您自己的 MediaTimeline,并将其与 MediaPlayerVideoDrawing 一起使用。

说明:

如果媒体随应用程序一起分发,则不能像图像那样将媒体文件用作项目资源。在项目文件中,必须将媒体类型改设为 Content,并将 CopyToOutputDirectory 设置为 PreserveNewestAlways

若要在不创建自己的 MediaTimeline 的情况下播放媒体,请执行下列步骤。

  1. 创建 MediaPlayer 对象。

    C#
    MediaPlayer player = new MediaPlayer();
    
  2. 使用 Open 方法加载媒体文件。

    C#
    player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
    
  3. 创建 VideoDrawing

    C#
    VideoDrawing aVideoDrawing = new VideoDrawing();
    
  4. 通过设置 VideoDrawingRect 属性指定要绘制媒体的大小和位置。

    C#
    aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
    
  5. 使用您创建的 MediaPlayer 来设置 VideoDrawingPlayer 属性。

    C#
    aVideoDrawing.Player = player;
    
  6. 使用 MediaPlayerPlay 方法开始播放媒体。

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

下面的示例使用 VideoDrawingMediaPlayer 播放视频文件一次。

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

若要对媒体进行更多的计时控制,请将 MediaTimelineMediaPlayerVideoDrawing 对象一起使用。通过 MediaTimeline,您可以指定是否重复播放视频。若要将 MediaTimelineVideoDrawing 一起使用,请执行下列步骤:

  1. 声明 MediaTimeline 并设置其计时行为。

    C#
    // Create a MediaTimeline.
    MediaTimeline mTimeline = 
        new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative)); 
    
    // Set the timeline to repeat.
    mTimeline.RepeatBehavior = RepeatBehavior.Forever;
    
  2. MediaTimeline 创建 MediaClock

    C#
    // Create a clock from the MediaTimeline.
    MediaClock mClock = mTimeline.CreateClock();
    
  3. 创建一个 MediaPlayer 并使用 MediaClock 设置其 Clock 属性。

    C#
    MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
    repeatingVideoDrawingPlayer.Clock = mClock;
    
  4. 创建一个 VideoDrawing,并将 MediaPlayer 分配给 VideoDrawingPlayer 属性。

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

下面的示例同时使用 MediaTimeline 以及 MediaPlayerVideoDrawing 来反复播放某视频。

C#
//
// 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 时,使用从 MediaClockController 属性返回的交互式 ClockController 控制媒体播放,而不是使用 MediaPlayer 的交互式方法。

您可以使用 GlyphRunDrawingGlyphRun 来绘制文本。下面的示例使用 GlyphRunDrawing 来绘制文本“Hello World”。

C#
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);
XAML
<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 是一个低级别的对象,旨在用于固定格式的文档演示文稿和打印方案中。将文本绘制到屏幕上的一种比较简单的方法是使用 LabelTextBlock。有关 GlyphRun 的更多信息,请参见 GlyphRun 对象和 Glyphs 元素简介概述。

使用 DrawingGroup,可将多个绘图组合为一个复合绘图。使用 DrawingGroup,您可将形状、图像和文本组合到一个 Drawing 对象中。

下面的示例使用 DrawingGroup 将两个 GeometryDrawing 对象和一个 ImageDrawing 对象组合到一起。该示例产生下面的输出。

复合绘图

具有多个绘图的 DrawingGroup
C#
//
// 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);

XAML
<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 操作按下列顺序应用:OpacityMaskOpacityBitmapEffectClipGeometryGuidelineSetTransform

下图演示 DrawingGroup 操作的应用顺序。

DrawingGroup 操作的顺序

DrawingGroup 操作顺序

下表描述您可用于操作 DrawingGroup 对象内容的属性。

属性

说明

图示

OpacityMask

改变 DrawingGroup 内容选定部分的不透明度。有关示例,请参见如何:控制绘图的不透明度

具有不透明遮罩的 DrawingGroup

Opacity

统一更改 DrawingGroup 内容的不透明度。使用此属性将 Drawing 设置为透明或部分透明。有关示例,请参见如何:向绘图应用不透明遮罩

具有不同不透明度设置的 DrawingGroup

BitmapEffect

BitmapEffect 应用到 DrawingGroup 内容。有关示例,请参见如何:向绘图应用 BitmapEffect

具有 BlurBitmapEffect 的 DrawingGroup

ClipGeometry

DrawingGroup 内容剪裁到您使用 Geometry 描述的区域内。有关示例,请参见如何:对绘图进行剪辑

具有定义的剪辑区域的 DrawingGroup

GuidelineSet

根据指定的准则将与设备无关的像素与设备像素对齐。此属性有助于确保清晰地在 DPI 较低的显示器上呈现图形的细节。有关示例,请参见如何:向绘图应用 GuidelineSet

具有和没有 GuidelineSet 的 DrawingGroup

Transform

变换 DrawingGroup 内容。有关示例,请参见如何:向绘图应用变换

旋转后的 DrawingGroup

若要使用 Image 控件显示 Drawing,请将 DrawingImage 用作 Image 控件的 Source,并将 DrawingImage 对象的 DrawingImage..::.Drawing 属性设置为您要显示的绘图。

下面的示例使用 DrawingImageImage 控件显示 GeometryDrawing。该示例产生下面的输出。

DrawingImage

两个椭圆的 GeometryDrawing
C#
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;
        }

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

DrawingBrush 是一种使用 Drawing 对象绘制区域的画笔。您可以使用它来借助 Drawing 绘制任何图形对象。DrawingBrushDrawing 属性描述其 Drawing。若要使用 DrawingBrush 呈现 Drawing,请使用画笔的 Drawing 属性将其添加到画笔中,并使用画笔绘制图形对象,例如控件或面板。

下面的示例使用从 GeometryDrawing 创建的图案通过 DrawingBrush 来绘制 RectangleFill。该示例产生下面的输出。

与 DrawingBrush 一起使用的 GeometryDrawing

平铺的 DrawingBrush
C#
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;
        }
    }
}
XAML
<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>
XAML
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 的更多信息,请参见使用图像、绘图和 Visual 进行绘制概述。

DrawingVisual 是一个用于呈现绘图的可视对象类型。开发人员可以选择直接在可视化层中工作,以生成一个高度自定义的图形环境,本概述中未对此进行说明。有关更多信息,请参见使用 DrawingVisual 对象概述。

通过 DrawingContext 类,您可以使用可视化内容填充 VisualDrawing。许多此类的低级图形对象使用 DrawingContext,因为它能十分有效地描述图形内容。

虽然 DrawingContext 的绘图方法似乎类似于 System.Drawing..::.Graphics 类型的绘图方法,但它们实际上却是大相径庭。具体来讲,DrawingContext 用于保留模式图形系统,而 System.Drawing..::.Graphics 类型则用于即时模式图形系统。使用 DrawingContext 对象的绘图命令时,实际上是在存储一系列呈现指令(但具体的存储机制则取决于提供 DrawingContext 的对象的类型)以供图形系统在以后使用,而不是实时绘制到屏幕上。有关 Windows Presentation Foundation (WPF) 图形系统工作方式的更多信息,请参见 Windows Presentation Foundation 图形呈现概述

绝不能直接实例化 DrawingContext;但可以通过某些方法(例如 DrawingGroup..::.OpenDrawingVisual..::.RenderOpen)获取绘图上下文。

此外,Drawing 对象还可提供用来枚举 Visual 内容的对象模型。

下面的示例使用 GetDrawing 方法来检索 VisualDrawingGroup 值并枚举该值。

C#
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.
         }
     }
 }
社区内容   什么是社区内容?
添加新内容 RSS  批注
Processing
© 2010 Microsoft Corporation 版权所有。 保留所有权利 | 商标 | 隐私权声明
Page view tracker