.net基础:矢量图形和WPF形状类

即使在相对乏味的二维矢量图形领域中,Windows Presentation Foundation (WPF) 仍会要求程 序员们学习许多新概念。在 WPF 中,图形对象已提升到与控件几乎平等的地位,经常参与布局并接收鼠 标、键盘和笔针输入。此外,图形系统会保留这些图形对象以便不再像过去使用图形时那样频繁地进行重 绘,并且它们还可移动和用作数据绑定的目标。

开始研究 WPF 时,我立刻想到将 System.Windows.Shapes 作为包含“婴儿”图形类的命 名空间。这些类似乎适合于显示简单的线条和矩形,但我认为成熟的 WPF 程序可能希望通过重写 OnRender 方法并调用 DrawingContext 类中的方法来实现各种功能。

DrawGeometry 方法似乎特 别诱人:在 WPF 中,Geometry 对象是已连接和未连接直线、弧线和 Bézier 曲线(在传统图形 编程中称为“路径”)的组合。DrawGeometry 的三个参数包括 Geometry 对象、用于绘制 Geometry 的直线和曲线的 Pen 以及用于填充封闭区域的 Brush。

Shapes 命名空间的作用

很快,我发现自己对 WPF 矢量图形的第一印象是错误的。大多数 WPF 程序并不需要重写 OnRender 方法和调用 DrawingContext 类中的方法。虽然重写 OnRender 是个不错的培训练习,但通常 在大多数主流应用程序中都不必重写它。

因此,至少在我看来,System.Windows.Shapes 命名空 间成为了用于在 WPF 中呈现二维矢量图形的命名空间。System.Windows.Shapes 命名空间包含以下类: Shape(抽象类)和 Line、Polyline、Polygon、Path、Rectangle 和 Ellipse(都是封装类)。

Shape 类自身是从 FrameworkElement 派生而来。最重要的 Shape 派生类无疑是 Path;该类与 DrawingContext 的 DrawGeometry 方法具有相同的功能,但麻烦要少得多。在 XAML 中使用 Path 类时 ,甚至可以使用编码绘图命令字符串来定义 Geometry 对象。

这并不表示 Shapes 类为所有应用 程序构建了一个通用的矢量图形解决方案。每个类的各个实例都是一个成熟的 WPF 元素,并且可能带来 更大开销。此外,每个类都只有一个画笔和一个填充画刷,而且提供的颜色可能比您需要的要少。

要呈现包含多种颜色的复杂矢量图形,有多种方法可供选择。当然,可以创建多个 Path 对象, 但如果希望将复杂图像用作自身的实体,则这种方法可能过于繁杂。此时,更好的解决方案是使用 DrawingGroup 类,它可以包含多个 GeometryDrawing 对象,而每个此类对象又都包含 Geometry、画笔 和填充画刷。DrawingGroup 对象可能是 WPF 中最接近传统图形元文件的实体。DrawingGroup 对象可作 为画刷的基础(通过 DrawingBrush),或者可通过 Image 类将其变成显示的 DrawingImage 对象。

如果仅需要适当数量的图形基元(尤其是当这些对象需要接收鼠标、键盘或笔针输入,或者进行 自身转换时),Shapes 命名空间中的类将是理想之选。

现在,我将介绍从 Shapes 命名空间中的 唯一未封装类 Shape 进行派生。可从 Shape 类进行派生以实现自定义矢量图形基元。从 Shape 派生是 确保这些自定义基元使用 WPF 布局系统的协议的最简单方法。

时间: 2024-08-03 16:50:57

.net基础:矢量图形和WPF形状类的相关文章

2000条你应知的WPF小姿势 基础篇<22-27 WPF生命周期, 基础类等>

原文:2000条你应知的WPF小姿势 基础篇<22-27 WPF生命周期, 基础类等> 端午长假在家陪着女朋友, 幸福感满满,生活对于一只饱经忧患的程序猿来说也是非常重要的,也就暂时没有更新博客.休假结束,回归奋斗的日子了,开始继续更新WPF系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2,000 Things You Should Kn

2000条你应知的WPF小姿势 基础篇&lt;28-33 WPF启动故事&gt;

原文:2000条你应知的WPF小姿势 基础篇<28-33 WPF启动故事> 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2,000 Things You Should Know About WPF .他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.Follow他的博客也有一段日子了,很希望能够分享给大家. 本系

2000条你应知的WPF小姿势 基础篇&lt;74-77 WPF 多窗口Tips&gt;

原文:2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips> 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2,000 Things You Should Know About WPF .他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.很希望能够分享给大家. 本系列我不仅会翻译他的每一个ti

2000条你应知的WPF小姿势 基础篇&lt;69-73 WPF Freeze机制和Template&gt;

原文:2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template> 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2,000 Things You Should Know About WPF .他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.很希望能够分享给大家. 本系列我不仅

class-急求,c++形状类的周长和面积 用虚函数写

问题描述 急求,c++形状类的周长和面积 用虚函数写 //1.定义形状类Shape,使其包含两个私有数据成员:float perimeter; float area; //2.定义三角形类Triangle,从Shape继承,并包含三个私有数据成员:float edge1; float edge2; float edge3;定义两个共有成员函数:float CalcPeri(); float CalcArea(); //3.定义矩形类Rectangle,从Shape继承,并包含两个私有数据成员:f

求源码,用java定义形状类,随机产生圆,椭圆、矩形,并输出中心点、面积、周长

问题描述 急求源码啊!谢谢1.定义一个形状类,Point,Shape2.派生出矩形(Rectangle).圆(Circle).椭圆(Ellipse)3.完成其中可能存在的多态方法4.需要有每种形状的输出,包括中心点.面积.周长的输出这是我的作业哦.我不理解什么叫多态啊! 解决方案 解决方案二:建议你找java图形编程的书来看.解决方案三:引用1楼ylz2007的回复: 建议你找java图形编程的书来看. 有这必要吗?我看楼主的意思是应用面向对象的啊!解决方案四:多态就是父类引用指向子类对象,运行

java类的问题-问点java的基础常识,两个类定义的时候将对方作为自己的成员变量的好处在哪?

问题描述 问点java的基础常识,两个类定义的时候将对方作为自己的成员变量的好处在哪? 没学过java,但是又急着看一份java源码,碰到了一个我没办法理解的问题,就是在java定义了两个类,定义的时候两个个类将对方作为自己的成员变量,同时类可以引用对方的成员变量.这样做是很正常的吗?好处在哪里? 示例如下; class a { b XX; } class b { a XX; } 解决方案 这样做很正常.有时候需要将获得的一些属性封装到另一个类中,或者是需要用到另一个类的方法或者是属性.封装性,

《C++语言基础》实践参考——分数类中的运算符重载

返回:贺老师课程教学链接 [项目3-分数类中的运算符重载] (1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简).比较(6种关系)的运算.可以在第4周分数类代码的基础上开始工作. class CFraction { private: int nume; // 分子 int deno; // 分母 public: //构造函数及运算符重载的函数声明 }; //重载函数的实现及用于测试的main()函数 [参考解答] #include <iostream> #inclu

C++实践参考——形状类族的中的纯虚函数

返回:贺老师课程教学链接  项目要求 [项目-形状类族的中的纯虚函数]写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形).Rectangle(矩形).Triangle(三角形).用如下的main()函数,求出定义的几个几何体的面积和.  int main() { Circle c1(12.6),c2(4.9);//建立Circle类对象c1,c2,参数为圆半径 Rectangle r1(4.5,8.4),r2(5.0,2.5);//建立Rectangle类对象r1,r