WPF_图画(一)Shape类及其派生类
WPF_图画(二)Drawing抽象类
WPF_图画(三)DrawingVisual类
Geometry抽象类表示形状或路径。Drawing抽象类扮演了互补的角色,它表示2D图画(Drawing)。
Drawing抽象类用于表示所有类型的2D图形,并且还有一小组类继承自该类:
类 | 说明 | 属性 |
---|---|---|
GeometryDrawing | 封装一个几何图形,该几何图形具有填充它的画刷和绘制其边框的画笔 | Geometry、Brush、Pen |
ImageDrawing | 封装一副图像(通常是基于文件的位图图像),该图像具有定义图像边界的矩形 | ImageSource、Rect |
VideoDrawing | 结合用于播放视频文件的媒体播放器和定义其边界的矩形 | Player、RectDr |
Drawing | 组合各种类型的Drawing |
因为继承自Drawing的类不是元素(没有继承UIElement类),所以不能将它们放置到用户界面中,所以还需要用于显示图画的类。
类 | 父类 | 说明 |
---|---|---|
DrawingImage | ImageSource | 允许在Image元素中驻留图画 |
DrawingBrush | Brush | 允许使用画刷封装图画,之后就可以用画刷绘制任何表面 |
DrawingVisual | Visual | 允许在低级的可视化对象中放置图画。可视化对象并不具有真正元素的开销,但是如果实现了需要的基础结构,那么仍可以显示可视化对象。 |
但是它们提供了使用更少系统资源显示2D内容的方法。可以减少元素数量。
<Button>
<Image Stretch="Fill">
<Image.Source>
<DrawingImage>
<DrawingImage.Drawing>
<GeometryDrawing Brush="Red">
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="0" />
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<EllipseGeometry
Center="50 50"
RadiusX="10"
RadiusY="5" />
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>
</Button>
为了使用DrawingImage,所以在Button中添加了一个Image元素(Image元素是占资源的),然后在DrawingImage中封装了GeometryDrawing对象。
对于上面那个例子,还可以更加省资源,就是使用DrawingBrush。
<Button>
<Button.Background>
<DrawingBrush Stretch="Fill" Viewport="0.1 0.1 0.8 0.8">
<DrawingBrush.Drawing>
<GeometryDrawing Brush="Red">
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="0" />
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<EllipseGeometry
Center="50 50"
RadiusX="10"
RadiusY="5" />
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
</Button.Background>
</Button>
注意,DrawingBrush中还有一个Viewport属性。
Visual类是抽象类,所以不能创建该类的实例。相反,需要使用继承自Visual类的某一个类,包括UIElement类(该类是WPF元素模型的根)、Viewport3DVisual类(显示3D)以及ContainerVisual类(包含其他可视化对象的基本容器)。但是最有用的派生类是DrawingVisual类,该类继承自ContainerVisual类,并增加了支持绘制向往放置到可视化对象中的图形内容的功能。
为使用DrawingVisual类绘制内容,需要调用DrawingVisual.RenderOpen()方法。该方法返回一个可用于定义可视化内容的DrawingContext对象。绘制完毕后,需要调用DrawingContext.Close方法。
DrawingVisual visual = new DrawingVisual();
DrawingContext dc = visual.RenderOpen();
//perform drawing here
Pen pen = new Pen(Brushes.Red, 3);
dc.DrawLine(pen, new Point(0, 50), new Point(50, 0));
dc.DrawLine(pen, new Point(50, 0), new Point(100, 50));
dc.DrawLine(pen, new Point(0, 50), new Point(100, 50));
dc.Close();
当调用DrawingContext方法时,没有实际绘制可视化对象----而只是定义了可视化外观。当调用Close()方法结束绘制时,完成的图画被存储在可视化对象中,并通过只读的DrawingVisual.Drawing属性提供这些图画。WPF会保存Drawing对象,从而当需要时可以重新绘制窗口。
使用可视化对象的方式:
为显示可视化对象,还需要借助于功能完备的WPF元素,WPF元素将可视化对象添加到可视化树中。单个元素具有显示任意数量可视化对象的能力,因此,可以很容易地创建只包含一两个元素,但驻留了几千个可视化对象的窗口。具体在这一篇中介绍:
为在元素中驻留可视化对象,需要执行以下任务: