本主题概述 WPF 可视化层。本主题重点讲述 WPF 模型中呈现支持的 Visual 类的角色。
Visual 对象的角色
Visual 类是每个 FrameworkElement 对象所派生自的基本抽象。该类还充当在 WPF 中编写新控件的入口点。在 Win32 应用程序模型中,该类在许多方面可以被视为窗口句柄 (HWND)。
Visual 对象是一个核心 WPF 对象,它的主要角色是提供呈现支持。用户界面控件(如 Button 和 TextBox)派生自 Visual 类,并使用该类来保持它们所呈现的数据。Visual 对象为下列功能提供支持:
输出显示:呈现 Visual 对象的持久的序列化绘图内容。
转换:针对 Visual 对象执行转换。
剪辑:为 Visual 对象提供剪辑区域支持。
命中测试:确定 Visual 对象的边界内是否包含坐标或几何形状。
边界框计算:确定 Visual 对象的边框。
但是,Visual 对象不包括对非呈现功能的支持,如:
◆事件处理
◆布局
◆样式
◆数据绑定
◆全球化
Visual 作为子类必须派生自的公共抽象类进行公开。下图显示了 WPF 中所公开的可视化对象的层次结构。
Visual 类的层次结构
DrawingVisual 类
DrawingVisual 是一个用于呈现形状、图像或文本的轻量绘图类。此类之所以被视为轻量,是因为它不提供布局或事件处理功能,从而能够改善运行时性能。因此,绘图最适于背景和剪贴画。DrawingVisual 可用于创建自定义可视化对象。
Viewport3DVisual 类
Viewport3DVisual 在二维 Visual 和 Visual3D 对象之间起到桥梁作用。Visual3D 类是所有三维可视化元素的基类。Viewport3DVisual 要求您定义一个 Camera 值和一个 Viewport 值。可以借助照相机来查看场景。投影映射到二维图面的区域称作视区。
ContainerVisual 类
ContainerVisual 类用作 Visual 对象集的容器。DrawingVisual 类派生自 ContainerVisual 类,这允许它包含可视化对象的集合。
可视化对象中的绘图内容
Visual 对象将它的呈现数据另存为向量图形指令列表。指令列表中的每一项都以序列化格式表示一组低级别的图形数据及其相关资源。共有四种不同类型的呈现数据可以包含绘图内容。
通过 DrawingContext,您可用可视化内容填充 Visual。当您使用 DrawingContext 对象的绘图命令时,实际上是存储一组日后将由图形系统使用的呈现数据,而不是实时绘制到屏幕上。
当您创建 WPF 控件(如 Button)时,该控件会为绘图对象本身隐式生成呈现数据。例如,设置 Button 的 Content 属性会导致该控件存储标志符号的呈现表示。
Visual 将其内容描述为一个或多个包含在 DrawingGroup 中的 Drawing 对象。DrawingGroup 还描述不透明蒙板、转换、位图效果和应用于其内容的其他操作。呈现内容时,DrawingGroup 操作按如下顺序应用:OpacityMask、Opacity、BitmapEffect、ClipGeometry、GuidelineSet 和 Transform。
下图显示了在呈现过程中 DrawingGroup 操作的应用顺序。
DrawingGroup 操作的顺序
在可视化层绘制内容
绝不能直接实例化 DrawingContext;但可以通过某些方法