WPF Control Development Unleashed(wpf控件开发揭秘) 章节二 不同的可视化类结构(未完成)

来源:互联网 发布:我的世界pe快速建造js 编辑:程序博客网 时间:2024/05/16 10:32

在第一章中,我们谈到了WPF框架的建筑很像一所房子的建设.如果你不知道某些实物为什么那么构造,你可能会不恰当的使用它们,并破坏某些东西.

本章是关于建造房屋时使用的工具.每个工匠(包括程序员!)知道为工作选择合适的工具对项目的成功是至关重要的.如果你使用的工具有太多的力量,你很可能会打碎一些东西或者在墙上打个洞.使用一些没有动力的工具,你也不能完成这项工作.

WPF提供了丰富多样的类库,可以创建从简单到复杂的视觉效果和视觉效果的分层组件的一切.有几十种工具,但由你来挑选合适的工具来做这项工作.每个类都有一个特定的目的和独特的优势,使其与其他类相分离.这允许我们混合和匹配类以满足我们的特定需求.

图2.1展示了我们在本章中详细检查的类的可视化层次结构.
这里写图片描述

可视化类的介绍

wpf具有丰富的模块和工具,你可以用来创造多样惊人的接口.知道何时使用何种工具对创建下一代应用程序是绝对宝贵的.以下是在WPF中的最重要的类的一个简要概述.这些类是您在使用本书和创建自己的应用程序时最常使用的类.

DispatcherObject类

DispatcherObject类包含在System.Windows.Threading命名空间下.它为所有WPF对象提供了基本的通信和线程处理能力.你将关注于DispatcherObject派生类的主要属性是Dispatcher的属性,这使您可以访问Dispatcher对象关联.正如它的名字所暗示的,调度系统负责监听各种消息,并确保在UI线程上通知需要通知该消息的任何对象.这个类没有任何图形表示,但它是框架的其余部分的基础.

DependencyObject类

DependencyObject类为wpf的依赖属性提供支持.依赖属性系统背后的主要目的是计算属性值.此外,它还提供有关属性值更改的通知.从标准的属性区分出wpf依赖属性的方法是看属性改变时数据上传是被动还是主动的.这是通过与依赖属性维护各种元数据信息和逻辑.Dependencyobject还支持附加属性,都包含在6章,”附加属性的特性,”和特性的继承.

Dependencyobject类是System.Windows命名空间的一部分,它没有图形表示.它是DispatcherObject派生的子类.

Visual类和DrawingVisual类

System.Windows.Media.Visual抽象类是wpf中所有绘图操作的中心.有其自然的视觉方面所有WPF类的后代以某种方式从视觉类.它提供了基本的屏幕服务,如呈现、缓存绘图指令、转换、剪切,当然还有包围盒和命中测试操作.

而视觉类包含了大量有用的功能,直到我们到drawingvisual类层次结构中,我们开始看到具体的实现,我们可以一起工作.drawingvisual继承,containervisual,设计包含一个收集视觉对象类.这批孩子的视觉效果是通过绘画性接触(类型drawinggroup).

drawingvisual类是一个轻量级的专做原渲染和不含其他高层次的类,如布局、事件、数据绑定等.记住本章的黄金法则:为工作选择正确的工具.如果你需要绘制图形和对象的简单的点击测试用户互动的程度,用drawingvisual类你可以节省很多开销.

一个很好的例子,应用drawingvisual类在制图中的将是一个很好的选择.你可以通过绘制基本图形,如线,生成各种图表、圆弧、文本和填充用实心画笔的颜色或更高级的如线性和径向渐变填充.

如果您需要图表作为数据绑定,您可能想知道如何为您的图表应用程序做些什么.你看到更多关于以后如何做到这一点,但请记住,一个数据处理模板的输出可以是简单的图形的视觉效果,使您可以创建数据绑定的图表只生产你所需要的功能.

Listing 2.1展示了一个在图表里画扇形的例子.在制图方面,一个扇形是一个封闭的区域,看起来像一片披萨.它有两条直线构成三角形的两边,但最后一块是用一条圆弧而不是另一条直线封闭的.

//LISTING 2.1 A "Pizza Slice” Sector Visual Classpublic class SectorVisual:DrawingVisual{    public SectorVisual    {        StreamGeometry geometry=new StreamGeometry();        using(StreamGeometryContext c=geometry.Open)        {            c.BeginFigure(new Point(200,200),true /* isFilled */, true /* isClosed */);            // First line            c.LineTo(new Point(175, 50), true /* isFilled */, true /* isClosed*/);            // Bottom arc            c.ArcTo(new Point(50, 150), new Size(1, 1), 0, true,SweepDirection.Counterclockwise, true /* isFilled */, true /* isClosed */);            // Second line            c.LineTo(new Point(200, 200),true /* isFilled */, true /* isClosed */);             }        // Draw the geometry        using (DrawingContext context = RenderOpen)        {            Pen pen = new Pen(Brushes.Black, 1);            context.DrawGeometry(Brushes.CornflowerBlue, pen, geometry);        }           }}

当呈现时,前面的类创建一个可视化,如图2.2所示.

这里写图片描述

如果你以前做过的任何其他平台的图形编程,你应该很熟悉DrawingContext类. 它本质上是一个入口点,在您的代码和用户监视器上实际呈现的像素之间的管道中。作为一个保留的WPF图形系统,缓存所有的绘图指令,使他们无论何时刷新是必需的。DrawingContext类被用来从中提取这些指令的缓存.在上面的代码中,我们使用StreamGeometryContext类建立几何的扇形,。然后用DrawingVisual类的renderopen方法获取引用当前drawingcontext实例绘制几何图案。DrawingContext类包含绘制线条,矩形,几何,文字,视频以及其他的方法,使用这些方法,你能建立起类似图2.1的扇形.

笔记

保留图形模式
记住wpf是一个保留模式的图形系统,这意味着所有的绘图指令都被缓存了,你不需要任何更新图形API强制刷新调用,比如在即时模式图形系统中。虽然DrawingVisual类和DrawingContext类类似于是你找到的快速图形方法系统,但要谨防像一个人那样使用它。你不应该把任何更新我的图形API视觉重绘.

原创粉丝点击