繪制形狀
您可以使用 GeometryDrawing 來繪制形狀。 幾何繪圖的 Geometry 屬性描述要繪制的形狀,其 Brush 屬性描述形狀內部的繪制方式,其 Pen 屬性描述其輪廓的繪制方式。
下面的示例使用 GeometryDrawing 繪制形狀。 該形狀由 GeometryGroup 和兩個 EllipseGeometry 對象進行描述。 形狀內部使用 LinearGradientBrush 進行繪制,其輪廓則使用 Black Pen 進行繪制。
本示例創建以下 GeometryDrawing。
GeometryDrawing
- //
- // Create the Geometry to draw.
- //
- GeometryGroup ellipses = new GeometryGroup();
- ellipses.Children.Add(
- new EllipseGeometry(new Point(50,50), 45, 20)
- );
- ellipses.Children.Add(
- new EllipseGeometry(new Point(50, 50), 20, 45)
- );
-
-
- //
- // Create a GeometryDrawing.
- //
- GeometryDrawing aGeometryDrawing = new GeometryDrawing();
- aGeometryDrawing.Geometry = ellipses;
-
- // Paint the drawing with a gradient.
- aGeometryDrawing.Brush =
- new LinearGradientBrush(
- Colors.Blue,
- Color.FromRgb(204,204,255),
- new Point(0,0),
- new Point(1,1));
-
- // Outline the drawing with a solid color.
- aGeometryDrawing.Pen = new Pen(Brushes.Black, 10);
-
<GeometryDrawing>
<GeometryDrawing.Geometry>
<!-- Create a composite shape. -->
<GeometryGroup>
<EllipseGeometry Center="50,50" RadiusX="45" RadiusY="20" />
<EllipseGeometry Center="50,50" RadiusX="20" RadiusY="45" />
</GeometryGroup>
</GeometryDrawing.Geometry>
<GeometryDrawing.Brush>
<!-- Paint the drawing with a gradient. -->
<LinearGradientBrush>
<GradientStop Offset="0.0" Color="Blue" />
<GradientStop Offset="1.0" Color="#CCCCFF" />
</LinearGradientBrush>
</GeometryDrawing.Brush>
<GeometryDrawing.Pen>
<!-- Outline the drawing with a solid color. -->
<Pen Thickness="10" Brush="Black" />
</GeometryDrawing.Pen>
</GeometryDrawing>
有關完整的示例,請參見 如何:創建 GeometryDrawing。
使用其他 Geometry 類(例如 PathGeometry),您可以通過創建曲線和弧線來創建更復雜的形狀。 有關 Geometry 對象的更多信息,請參見 Geometry 概述。
有關不使用 Drawing 對象繪制形狀的其他方法的更多信息,請參見 WPF 中的形狀和基本繪圖概述。
繪制圖像
您可以使用 ImageDrawing 繪制圖像。 ImageDrawing 對象的 ImageSource 屬性描述要繪制的圖像,其 Rect 屬性定義繪制圖像的區域。
下面的示例將在一個矩形的 (75,75) 處繪制一個大小為 100 x 100 像素的圖像。 下面的插圖顯示在示例中創建的 ImageDrawing。 添加了一條灰色邊框,以顯示 ImageDrawing 的邊界。
大小為 100 x 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"/>
有關圖像的更多信息,請參見 圖像處理概述。
播放媒體(僅限代碼)
您可以使用 VideoDrawing 和 MediaPlayer 來播放音頻或視頻文件。 加載並播放媒體的方法有兩種。 第一種方法是使用 MediaPlayer 和 VideoDrawing 自身,第二種方法是創建您自己的 MediaTimeline,並將其與 MediaPlayer 和 VideoDrawing 一起使用。
說明 |
如果媒體隨應用程序一起分發,則不能像圖像那樣將媒體文件用作項目資源。 在項目文件中,必須將媒體類型改設為 Content,並將 CopyToOutputDirectory 設置為 PreserveNewest 或 Always。 |
若要在不創建自己的 MediaTimeline 的情況下播放媒體,請執行下列步驟。
-
創建 MediaPlayer 對象。
- MediaPlayer player = new MediaPlayer();
-
-
使用 Open 方法加載媒體文件。
- player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
-
-
創建 VideoDrawing。
- VideoDrawing aVideoDrawing = new VideoDrawing();
-
-
通過設置 VideoDrawing 的 Rect 屬性指定要繪制媒體的大小和位置。
- aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
-
-
使用您創建的 MediaPlayer 來設置 VideoDrawing 的 Player 屬性。
- aVideoDrawing.Player = player;
-
-
使用 MediaPlayer 的 Play 方法開始播放媒體。
- // Play the video once.
- player.Play();
-
下面的示例使用 VideoDrawing 和 MediaPlayer 播放視頻文件一次。
- //
- // Create a VideoDrawing.
- //
- MediaPlayer player = new MediaPlayer();
-
- player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
-
- VideoDrawing aVideoDrawing = new VideoDrawing();
-
- aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
-
- aVideoDrawing.Player = player;
-
- // Play the video once.
- player.Play();
-
-
若要對媒體進行更多的計時控制,請將 MediaTimeline 與 MediaPlayer 和 VideoDrawing 對象一起使用。 通過 MediaTimeline,您可以指定是否重復播放視頻。 若要將 MediaTimeline 與 VideoDrawing 一起使用,請執行下列步驟:
-
聲明 MediaTimeline 並設置其計時行為。
- // Create a MediaTimeline.
- MediaTimeline mTimeline =
- new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
-
- // Set the timeline to repeat.
- mTimeline.RepeatBehavior = RepeatBehavior.Forever;
-
-
從 MediaTimeline 創建 MediaClock。
- // Create a clock from the MediaTimeline.
- MediaClock mClock = mTimeline.CreateClock();
-
-
創建一個 MediaPlayer 並使用 MediaClock 設置其 Clock 屬性。
- MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
- repeatingVideoDrawingPlayer.Clock = mClock;
-
-
創建一個 VideoDrawing,並將 MediaPlayer 分配給 VideoDrawing 的 Player 屬性。
- VideoDrawing repeatingVideoDrawing = new VideoDrawing();
- repeatingVideoDrawing.Rect = new Rect(150, 0, 100, 100);
- repeatingVideoDrawing.Player = repeatingVideoDrawingPlayer;
-
下面的示例同時使用 MediaTimeline 以及 MediaPlayer 和 VideoDrawing 來反復播放某視頻。
- //
- // Create a VideoDrawing that repeats.
- //
-
- // Create a MediaTimeline.
- MediaTimeline mTimeline =
- new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
-
- // Set the timeline to repeat.
- mTimeline.RepeatBehavior = RepeatBehavior.Forever;
-
- // Create a clock from the MediaTimeline.
- MediaClock mClock = mTimeline.CreateClock();
-
- MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
- repeatingVideoDrawingPlayer.Clock = mClock;
-
- VideoDrawing repeatingVideoDrawing = new VideoDrawing();
- repeatingVideoDrawing.Rect = new Rect(150, 0, 100, 100);
- repeatingVideoDrawing.Player = repeatingVideoDrawingPlayer;
-
請注意,使用 MediaTimeline 時,使用從 MediaClock 的 Controller 屬性返回的交互式 ClockController 控制媒體播放,而不是使用 MediaPlayer 的交互式方法。
繪制文本
您可以使用 GlyphRunDrawing 和 GlyphRun 來繪制文本。 下面的示例使用 GlyphRunDrawing 來繪制文本“Hello World”。
- GlyphRun theGlyphRun = new GlyphRun(
- new GlyphTypeface(new Uri(@"C:\WINDOWS\Fonts\TIMES.TTF")),
- 0,
- false,
- 13.333333333333334,
- new ushort[]{43, 72, 79, 79, 82, 3, 58, 82, 85, 79, 71},
- new Point(0, 12.29),
- new double[]{
- 9.62666666666667, 7.41333333333333, 2.96,
- 2.96, 7.41333333333333, 3.70666666666667,
- 12.5866666666667, 7.41333333333333,
- 4.44, 2.96, 7.41333333333333},
- null,
- null,
- null,
- null,
- null,
- null
-
-
- );
-
- GlyphRunDrawing gDrawing = new GlyphRunDrawing(Brushes.Black, theGlyphRun);
-
<GlyphRunDrawing ForegroundBrush="Black">
<GlyphRunDrawing.GlyphRun>
<GlyphRun
CaretStops="{x:Null}"
ClusterMap="{x:Null}"
IsSideways="False"
GlyphOffsets="{x:Null}"
GlyphIndices="43 72 79 79 82 3 58 82 85 79 71"
BaselineOrigin="0,12.29"
FontRenderingEmSize="13.333333333333334"
DeviceFontName="{x:Null}"
AdvanceWidths="9.62666666666667 7.41333333333333 2.96 2.96 7.41333333333333 3.70666666666667 12.5866666666667 7.41333333333333 4.44 2.96 7.41333333333333"
BidiLevel="0">
<GlyphRun.GlyphTypeface>
<GlyphTypeface FontUri="C:\WINDOWS\Fonts\TIMES.TTF" />
</GlyphRun.GlyphTypeface>
</GlyphRun>
</GlyphRunDrawing.GlyphRun>
</GlyphRunDrawing>
GlyphRun 是低級別的對象,擬用於固定格式的文檔表示和打印方案。 將文本繪制到屏幕上的一種比較簡單的方法是使用 Label 或 TextBlock。 有關 GlyphRun 的更多信息,請參見 GlyphRun 對象和 Glyphs 元素簡介概述。
復合繪圖
使用 DrawingGroup,可將多個繪圖組合為一個復合繪圖。 使用 DrawingGroup,您可將形狀、圖像和文本組合到一個 Drawing 對象中。
下面的示例使用 DrawingGroup 將兩個 GeometryDrawing 對象和一個 ImageDrawing 對象組合到一起。 該示例產生下面的輸出。
復合繪圖

- //
- // Create three drawings.
- //
- GeometryDrawing ellipseDrawing =
- new GeometryDrawing(
- new SolidColorBrush(Color.FromArgb(102, 181, 243, 20)),
- new Pen(Brushes.Black, 4),
- new EllipseGeometry(new Point(50,50), 50, 50)
- );
-
- ImageDrawing kiwiPictureDrawing =
- new ImageDrawing(
- new BitmapImage(new Uri(@"sampleImages\kiwi.png", UriKind.Relative)),
- new Rect(50,50,100,100));
-
- GeometryDrawing ellipseDrawing2 =
- new GeometryDrawing(
- new SolidColorBrush(Color.FromArgb(102,181,243,20)),
- new Pen(Brushes.Black, 4),
- new EllipseGeometry(new Point(150, 150), 50, 50)
- );
-
- // Create a DrawingGroup to contain the drawings.
- DrawingGroup aDrawingGroup = new DrawingGroup();
- aDrawingGroup.Children.Add(ellipseDrawing);
- aDrawingGroup.Children.Add(kiwiPictureDrawing);
- aDrawingGroup.Children.Add(ellipseDrawing2);
-
-
<DrawingGroup>
<GeometryDrawing Brush="#66B5F314">
<GeometryDrawing.Geometry>
<EllipseGeometry Center="50,50" RadiusX="50" RadiusY="50"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="4" />
</GeometryDrawing.Pen>
</GeometryDrawing>
<ImageDrawing ImageSource="sampleImages\kiwi.png" Rect="50,50,100,100"/>
<GeometryDrawing Brush="#66B5F314">
<GeometryDrawing.Geometry>
<EllipseGeometry Center="150,150" RadiusX="50" RadiusY="50"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="4" />
</GeometryDrawing.Pen>
</GeometryDrawing>
</DrawingGroup>
通過 DrawingGroup,您還可以對其內容應用不透明度蒙版、變換、位圖效果及其他操作。 DrawingGroup 操作按下列順序應用: OpacityMask、 Opacity、 BitmapEffect、 ClipGeometry、 GuidelineSet 和 Transform。
下圖演示 DrawingGroup 操作的應用順序。
DrawingGroup 操作的順序

下表描述您可用於操作 DrawingGroup 對象內容的屬性。
使用 Drawing 繪制對象
DrawingBrush 是一種使用 Drawing 對象繪制區域的畫筆。 您可以使用它來借助 Drawing 繪制任何圖形對象。 DrawingBrush 的 Drawing 屬性描述其 Drawing。 若要使用 DrawingBrush 呈現 Drawing,請使用畫筆的 Drawing 屬性將其添加到畫筆中,並使用畫筆繪制圖形對象,例如控件或面板。
下面的示例使用從 GeometryDrawing 創建的圖案通過 DrawingBrush 來繪制 Rectangle 的 Fill。 該示例產生下面的輸出。
與 DrawingBrush 一起使用的 GeometryDrawing
- using System;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Media;
- using System.Windows.Media.Animation;
- using System.Windows.Shapes;
-
- namespace SDKSample
- {
- public class 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>
DrawingBrush 類提供了用於拉伸和平鋪其內容的各種選項。 有關 DrawingBrush 的更多信息,請參見 使用圖像、繪圖和 Visual 進行繪制概述。
參考
概念
http://technet.microsoft.com/zh-cn/office/ms751619%28v=vs.110%29