WPF(Windows Presentation Foundation)提供了丰富的图形绘制功能,让开发人员能够创建各种精美的2D图形界面。本文将全面介绍WPF中的平面画图方式,并通过实例帮助您掌握这些技术。
1. WPF绘图的基础知识
WPF的绘图系统建立在矢量图形基础上,这意味着所有图形都可以无损地缩放。WPF提供了多种绘制平面图形的方式,主要包括以下几类:
- 使用预定义的形状控件
- Canvas画布控件和绘图对象
- 使用Path和Geometry
- 使用DrawingContext直接绘制
- 使用WriteableBitmap进行像素级操作
2. 使用预定义形状控件
WPF提供了一系列内置的形状控件,如Rectangle、Ellipse、Line等,它们都继承自Shape类。
csharp
<Canvas>
<!-- 矩形 -->
<Rectangle Width="100" Height="50" Fill="Blue" Stroke="Black" StrokeThickness="2" Canvas.Left="10" Canvas.Top="10"/>
<!-- 椭圆 -->
<Ellipse Width="100" Height="50" Fill="Red" Stroke="Black" StrokeThickness="2" Canvas.Left="120" Canvas.Top="10"/>
<!-- 直线 -->
<Line X1="10" Y1="70" X2="110" Y2="120" Stroke="Green" StrokeThickness="2"/>
<!-- 多边形 -->
<Polygon Points="120,70 170,70 200,120 120,120" Fill="Yellow" Stroke="Black" StrokeThickness="2"/>
</Canvas>
这些控件简单易用,适合创建基本的图形界面。
3. Canvas画布与绘图对象
Canvas是最常用的绘图容器,它允许通过Canvas.Left和Canvas.Top属性精确定位子元素。在代码中,我们可以动态地向Canvas添加形状:
csharp
// 创建一个矩形
Rectangle rect = new Rectangle
{
Width = 100,
Height = 50,
Fill = Brushes.Blue,
Stroke = Brushes.Black,
StrokeThickness = 2
};
// 设置位置
Canvas.SetLeft(rect, 10);
Canvas.SetTop(rect, 10);
// 添加到Canvas
myCanvas.Children.Add(rect);
4. 使用Path和Geometry
Path元素结合Geometry对象可以创建复杂的图形路径:
csharp
<Path Stroke="Black" StrokeThickness="2" Fill="LightBlue">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigure StartPoint="10,10">
<PathFigure.Segments>
<LineSegment Point="100,10" />
<ArcSegment Point="100,100" Size="90,90" />
<LineSegment Point="10,100" />
<LineSegment Point="10,10" />
</PathFigure.Segments>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
还可以使用简洁的几何标记语言(XAML Path Markup Syntax):
csharp
<Path Stroke="Black" Fill="Gold" StrokeThickness="2">
<Path.Data>
<!-- M=起点 L=线段 C=三次贝塞尔曲线 Z=闭合路径 -->
<PathGeometry Figures="M 10,100 L 100,100 L 100,50 C 150,30 150,30 200,50 L 200,100 L 290,100 Z" />
</Path.Data>
</Path>
5. 使用DrawingContext直接绘制
通过重写OnRender方法,我们可以使用DrawingContext直接绘制图形:
csharp
public class MyDrawing : FrameworkElement
{
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext