WPF的图形出现 (wpf 绘图)

本文目录导航:
WPF的图形出现
本主题概述 WPF 可视化层 本主题重点讲述 WPF 模型中出现支持的 Visual 类的角色
Visual 对象的角色 Visual 类是每个 FrameworkElement 对象所派生自的基本形象 该类还充任在 WPF 中编写新控件的入口点 在 Win 运行程序模型中 该类在许多方面可以被视为窗口句柄 (HWND)
Visual 对象是一个外围 WPF 对象 它的重要角色是提供出现支持 用户界面控件(如 Button 和 TextBox)派生自 Visual 类 并经常使用该类来坚持它们所出现的数据 Visual 对象为下列配置提供支持
输入显示 出现 Visual 对象的耐久的序列化绘图内容
转换 针对 Visual 对象口头转换
剪辑 为 Visual 对象提供剪辑区域支持
命中测试 确定 Visual 对象的边界内能否蕴含坐标或几何形态
边界框计算 确定 Visual 对象的边框
然而 Visual 对象不包括对非出现配置的支持 如 ◆事情处置
◆规划
◆样式
◆数据绑定
◆世界化
Visual 作为子类必定派生自的公共形象类启动地下 下图显示了 WPF 中所地下的可视化对象的档次结构
Visual 类的档次结构
DrawingVisual 类DrawingVisual 是一个用于出现形态 图像或文本的轻量绘图类 此类之所以被视为轻量 是由于它不提供规划或事情处置配置 从而能够改善运转时性能 因此 绘图最适于背景和剪贴画 DrawingVisual 可用于创立自定义可视化对象
Viewport DVisual 类Viewport DVisual 在二维 Visual 和 Visual D 对象之间起到桥梁作用 Visual D 类是一切三维可视化元素的基类 Viewport DVisual 要求您定义一个 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 但可以经过某些方法
(例如 DrawingGroup :: Open 和 DrawingVisual :: RenderOpen)失掉绘图高低文 上方的示例从 DrawingVisual 中检索 DrawingContext 并将其用于绘制矩形
在可视化层枚举绘图内容此外 Drawing 对象还可提供用来枚举 Visual 内容的对象模型
说明 您在枚举可视化层的内容时 就是相当于在检索 Drawing 对象 而不是以向量图形指令列表方式检索出现数据的基础示意 上方的示例经常使用 GetDrawing 方法来检索 Visual 的 DrawingGroup 值并枚举该值
如何经常使用可视化对象来生成控件 WPF 中的许多对象都由其余可视化对象组成 这象征着它们可以蕴含子代对象的各种档次结构 WPF 中的许多用户界面元素(如控件)都由多个示意不同类型出现元素的可视化对象组成 例如 Button 控件可以蕴含许多其余对象 其中包括 ClassicBorderDecorator ContentPresenter 和 TextBlock
上方的代码显示的是在标志中定义的 Button 控件
假设您要枚举蕴含自动 Button 控件的可视化对象 则将发现如下所示的可视化对象档次结构
可视化树档次结构的相关图
Button 控件蕴含一个 ClassicBorderDecorator 元素 该元素又蕴含一个 ContentPresenter 元素 ClassicBorderDecorator 元素担任为 Button 绘制边框和背景 ContentPresenter 元素担任显示 Button 的内容 在本例中 由于您要显示文本 因此 ContentPresenter 元素中蕴含一个 TextBlock 元素 Button 控件经常使用 ContentPresenter 这象征着该控件的内容可以由其余元素(如 Image)或几何形态(如 EllipseGeometry)来示意
控件模板将控件裁减为控件档次结构的关键在于 ControlTemplate 控件模板为控件指定自动的可视化档次结构 当您显式援用某个控件时 会隐式援用它的可视化档次结构 您可以重写控件模板的自动值 以便为控件创立自定义的可视化外观 例如 您可以修正 Button 控件的背风光彩值 以便它经常使用线性突变色彩值 而不经常使用纯色值
用户界面元素(如 Button 控件)蕴含几个向量图形指令列表 这些列表形容控件的所有出现定义 上方的代码显示的是在标志中定义的 Button 控件
假设您要枚举蕴含 Button 控件的可视化对象和向量图形指令列表
则将发现如下所示的可视化对象档次结构
可视化树和出现数据的相关图
Button 控件蕴含一个 ClassicBorderDecorator 元素 该元素又蕴含一个 ContentPresenter 元素 ClassicBorderDecorator 元素担任绘制一切造成按钮边框和背景的团圆图形元素 ContentPresenter 元素担任显示 Button 的内容 在本例中 由于您要显示图像 因此 ContentPresenter 元素中蕴含一个 Image 元素
关于可视化对象和向量图形指令列表的档次结构 须要留意多个事项
该档次结构中的排序示意绘图消息的出现顺序 从可视化元素的根 依照从左到右 从上到下的顺序遍历子元素 假设某个元素有可视化子元素 则会先遍历该元素的子元素 而后再遍历该元素的同级
档次结构中的非叶节点元素(如 ContentPresenter)用于蕴含子元素 它们并不蕴含指令列表
假设可视化元素既蕴含向量图形指令列表又蕴含可视化子级 则会先出现父级可视化元素中的指令列表 而后再出现任何可视化子对象中的绘图
向量图形指令列表中的项依照从左到右的顺序出现
可视化树 可视化树中蕴含某个运行程序的用户界面所经常使用的一切可视化元素 由于可视化元素中蕴含耐久的绘图消息 因此您可以将可视化树视为场景图 其中蕴含将输入写入显示设施所必需的所有出现消息 该树会集了由该运行程序在代码或标志中间接创立的一切可视化元素 该可视化树还蕴含由元素(如控件和数据对象)的模板裁减配置创立的一切可视化元素
上方的代码显示的是在标志中定义的 StackPanel 元素
假设您要枚举蕴含标志示例中 StackPanel 元素的可视化对象 将发现如下所示可视化对象的档次结构
可视化树档次结构的相关图
出现顺序经过可视化树 可以确定 WPF 可视化对象和绘图对象的出现顺序 将从位于可视化树中最顶层节点中的可视化元素根开局遍历 而后将依照从左到右的顺序遍历可视化元素根的子级 假设某个可视化元素有子级 则将先遍历该可视化元素的子级 而后再遍历其同级 这象征着子可视化元素的内容先于该可视化元素自身的内容而出现
可视化树出现顺序的相关图
可视化元素根可视化元素根是可视化树档次结构中最顶层的元素 在大少数运行程序中 可视化元素根的基类是 Window 或 NavigationWindow 然而 假设您在 Win 运行程序中承载可视化对象 则可视化元素根将是在 Win 窗口中承载的最顶层的可视化元素
与逻辑树的相关WPF 中的逻辑树示意运行程序在运转时的元素 虽然您不间接操作该树 然而该运行程序视图关于了解属性承袭和事情路由十分有用 与可视化树不同 逻辑树可以示意非可视化数据对象(如 ListItem) 在许多状况下 逻辑树亲密映射到运行程序的标志定义 上方的代码显示的是在标志中定义的 DockPanel 元素
假设您要枚举蕴含标志示例中 DockPanel 元素的逻辑对象 则将发现如下所示逻辑对象的档次结构
逻辑树的相关图
可视化树和逻辑树与以后的运行程序元素汇合同步 并反映对元素启动的任何参与 删除或修正 然而 这些树示意不同的运行程序视图 与可视化树不同 逻辑树不倒退控件的 ContentPresenter 元素 这象征着同一组对象的逻辑树和可视化树之间没有间接的一对一对应相关 实践上 在将同一个元素用作参数的状况下 调用 LogicalTreeHelper 对象的 GetChildren 方法与调用 VisualTreeHelper 对象的 GetChild 方法会生成不同的结果
经常使用 XamlPad 检查可视化树WPF 工具 (XamlPad) 提供了一个用来检查和阅读可视化树的选项 该树与以后所定义的 XAML 内容相对应 单击菜单栏上的 显示可视化树 Show Visual Tree]按钮可显示相应的可视化树
上方将说明如何在 XamlPad 的 可视化树资源治理器 Visual Tree Explorer]面板中将 XAML 内容裁减为可视化树节点
XamlPad 中的 可视化树资源治理器 Visual Tree Explorer]面板
请留意 Label TextBox 和 Button 控件在 XamlPad 的 可视化树资源治理器 Visual Tree Explorer]面板中各自显示一个可视化对象档次结构 这是由于 WPF 控件具有一个蕴含其可视化树的 ControlTemplate 当您显式援用某个控件时 会隐式援用它的可视化档次结构
剖析可视化性能WPF 提供了一套性能剖析工具 来协助您剖析运行程序的运转时行为 并确定可以运行的性能优化的类型 可视化探查器工具经过间接映射到运行程序的可视化树来为性能数据提供一个丰盛的图形视图 在此屏幕快照中 可视化探查器的 CPU Usage CPU 经常使用率]局部使您可以分明地了解对象对 WPF 服务(如出现和规划)的经常使用状况
可视化探查器显示输入
可视化对象的出现行为 WPF 引进了几个影响可视化对象出现行为的配置 保管的形式图形 矢量图形和与设施有关的图形
保管的形式图形了解即时形式和保管形式图形系统之间的区别是了解 Visual 对象角色的要点之一 基于 GDI 或 GDI+ 的规范 Win 运行程序经常使用即时形式图形系统 这象征着运行程序担任从新绘制上班区中由于某项操作(如调整窗口大小)或许对象的可视化外观出现变动而失效的局部
Win 出现顺序的相关图
与之相比 WPF 经常使用保管形式系统 这象征着具有可视化外观的运行程序对象定义一组序列化绘图数据 在定义了绘图数据之后 系统会照应一切的从新绘制恳求来出现运行程序对象 甚至在运转时 您也可以修正或创立运行程序对象 并依旧依赖系统照应绘制恳求 保管形式图形系统中有一个弱小配置 那就是绘图消息总是由运行程序坚持为序列化形态 然而出现配置仍由系统担任 上方的相关图展示运行程序如何依赖 WPF 来照应绘制恳求
WPF 出现顺序的相关图
智能重绘经常使用保管模型图形的最大好处之一就是 WPF 可以高效率地优化须要在运行程序中重绘的内容 即使您有一个具有各种不透明度的复杂场景 理论也不用编写不凡用途的代码来优化重绘配置 请将智能重绘配置与 Win 编程启动比拟 在后者中 可以经过最小化降级区域中的重绘量来尽力优化运行程序
向量图形WPF 经常使用向量图形作为其出现数据的格局 向量图形(包括可缩放的向量图形 (SVG) Windows 元文件 ( wmf) 和 TrueType 字体)存储出现数据 并以指令列表的方式传输该出现数据 这些指令形容如何经常使用图形基元来从新创立图像 例如 TrueType 字体是形容一组直线 曲线和命令(而不是像素数组)的矢量字 矢量图形的重要好处之一就是能够伸缩就任何大小和分辨率
与矢量图形不同 位图图形以图像的逐像素示意方式来存储出现数据 而且在特定的分辨率下预先出现 位图图形格局和矢量图形格局的重要区别之一就是对原始图像的保真度 例如 当某个源图像的大小出现变动时 位图图形系统会拉伸该图像 而向量图形系统会伸缩该图像 从而坚持图像的保真度
下图显示了源图像在加大到 倍时的状况 请留意 当源图像作为位图图形拉伸时会出现失真 而当源图像作为矢量图形伸缩时 则不会出现失真
光栅图形和矢量图形之间的区别
上方的标志显示所定义的两个 Path 元素 第二个元素经常使用 ScaleTransform 将第一个元素的绘图指令加大到 倍 请留意 Path 元素中的绘图指令坚持不变
关于分辨率和与设施有关的图形可经过以下两个系统因子来确定屏幕上的文本大小和图形大小 分辨率和 DPI 分辨率形容出如今屏幕上的像素数量 由于分辨率变大 因此像素会变小 从而造成所显示的图形和文本会变小 在将显示器的分辨率从 x 更改为 x 时 显示器上所显示的图形会小得多
另一个系统设置 (DPI) 以像素数来形容屏幕英寸的大小 大少数 Windows 系统的 DPI 都为 这象征着一屏幕英寸等于 个像素 参与 DPI 设置会使屏幕英寸变大 减小 DPI 会使屏幕英寸变小 这象征着屏幕英寸与实践的英寸不相等 在少数系统上 二者很有或许不相等 当您参与 DPI 时 屏幕英寸会变大 因此支持 DPI 的图形和文本也会变大 参与 DPI 或许会增强文本的可读性 在高分辨率下尤其如此
并非一切的运行程序都支持 DPI 一些运行程序将配件像素作为其重要计量单位 更改系统 DPI 不会对这些运行程序发生任何影响 许多其余运行程序都经常使用支持 DPI 的单位来形容字号 经常使用像历来形容任何其余内容 DPI 太小或太大都或许会造成这些运行程序出现规划疑问 由于运行程序的文本会随着系统的 DPI 设置而伸缩 而运行程序的 UI 却不会出现此类疑问 关于经常使用 WPF 开发的运行程序 此疑问曾经消弭
WPF 支持经过将与设施有关的像素(而不是配件像素)用作其重要计量单位来智能伸缩 图像和文本会适当伸缩 而无需运行程序开发人员口头任何额外的上班 下图显示了 WPF 文本和图形在不同 DPI 设置下的显示方式的示例
不同 DPI 设置下的图形和文本
VisualTreeHelper 类 VisualTreeHelper 类是一个静态协助器类 它提供了一个要在可视化对象级别编程的低级配置 该类在十分不凡的打算(如开发高性能自定义控件)中十分有用
在大少数状况下 更初级的 WPF 框架对象(如 Canvas 和 TextBlock)提供更大的灵敏性且更易于经常使用
命中测试VisualTreeHelper 类提供了当自动的命中测试支持不可满足您的须要时 针对可视化对象的命中测试方法 可以在 VisualTreeHelper 类中经常使用 HitTest 方法来确定几何形态或点坐标值能否位于给定对象(如控件或图形元素)的边界内 例如 您可以经常使用命中测试来确定鼠标在对象边框中的单击点能否落在圆形几何形态外部 您还可以选用重写对命中测试的自动成功来口头自己的自定义命中测试计算
枚举可视化树VisualTreeHelper 类提供了用来枚举可视化树成员的配置 若要检索父级 请调用 GetParent 方法 若要检索可视化对象的子级或间接子代 请调用 GetChild 方法 此方法前往父级在指定索引处的子 Visual
上方的示例展示如何枚举一个可视化对象的一切子代 假设您对序列化可视化对象档次结构的一切出现消息感兴味 则或许宿愿经常使用该技术
在大少数状况下 逻辑树更能示意 WPF 运行程序中的元素 虽然您不间接修正逻辑树 然而该运行程序视图关于了解属性承袭和事情路由十分有用 与可视化树不同 逻辑树可以示意非可视化数据对象(如 ListItem) VisualTreeHelper 类提供用来前往可视化对象边框的方法 可以经过调用 GetContentBounds 来前往可视化对象的边框 可以经过调用 GetDescendantBounds 来前往可视化对象及其一切子代的边框 上方的代码展示如何计算可视化对象及其一切子代的边框
lishixinzhi/Article/program/net//C#.NET 如何处置 多控件窗体规划刷新慢
一点阅历:
介绍几个文章给你:
C#和WPF的性能优化阅历剖析:
性能优化阅历总结
前端性能优化全攻略
ANTS Performance Profiler配置特色:
ANTS Performance Profiler具有宽泛的运行范畴,实用于各种言语开发。
无论是C#、、托管C++还是的开发者,都能借助它优化代码性能。
它特意实用于网络运行,能精准识别网站和网络服务中的性能瓶颈,甚至提醒网页加载缓慢的深档次要素,协助优化用户体验。
关于Windows窗体运行程序,ANTS性能剖析器雷同体现杰出,能够对泛滥客户端运前启动深化剖析,优化性能。
无论你的名目是 1.1、2.0、3.0还是3.5版本,包括WCF(Indigo)、WPF(Avalon)、WF和XBAP技术,它都能无缝顺应。
不只如此,ANTS还支持多种主机环境,如IIS 5、6、7以及开发主机Cassini,确保网络运行在不同平台上的性能优化。
关于64位处置器的x64剖析,它雷同随心所欲。
与Visual Studio 2005和2008版本无缝集成,使得性能剖析变得轻松快捷。
只有轻点几下,ANTS就会在IDE中启动,且预设了口头门路,无需额外设置。
它还能协助你修正代码疑问,经过期间线配置,你可以聚焦于疑问区域,检查具体的数据。
而其调用树配置则能智能聚焦在性能最差的口头堆栈追踪上,提供明晰的优化门路。
文章评论