写这篇博客的目的,一方面是为了巩固自己的基础知识和对概念的清楚,二是为了应付某些傻逼面试官照着官方文档里的知识点来问人。重在理解,面试前记一记就好。
- 布局
-
Canvas:子控件提供其自己的布局。
-
DockPanel:子控件与面板的边缘对齐。
-
Grid:子控件由行和列定位。
-
StackPanel:子控件垂直或水平堆叠。
-
VirtualizingStackPanel:子控件在水平或垂直的行上虚拟化并排列。
-
WrapPanel:子控件按从左到右的顺序定位,在当前行上的控件超出允许的空间时,换行到下一行。
数据绑定
-
将数据从托管对象复制到控件,在控件中可以显示和编辑数据。
-
确保使用控件对数据所做的更改将复制回托管对象。
显卡
-
图形与分辨率和设备均无关。 WPF 图形系统中的基本度量单位是与设备无关的像素(即 1/96 英寸),且不考虑实际屏幕分辨率,并为实现与分辨率和设备无关的呈现提供了基础。 每个与设备无关的像素都会自动缩放,以匹配呈现它的系统的每英寸点数 (dpi) 设置。
-
精度更高。 WPF 坐标系统使用双精度浮点数字度量,而不是单精度数字。 转换和不透明度值也表示为双精度数字。 WPF 还支持广泛的颜色域 (scRGB),并集成了对管理来自不同颜色空间的输入的支持。
-
高级图形和动画支持。 WPF 通过为你管理动画场景简化了图形编程,你无需担心场景处理、呈现循环和双线性内插。 此外,WPF 还提供了点击测试支持和全面的 alpha 合成支持。
-
硬件加速。 WPF 图形系统充分利用图形硬件来尽量降低 CPU 使用率。
二维几何图形
- WPF 提供的二维形状包含基本形状的标准集。 但是,你可能需要创建自定义形状以帮助改进自定义用户界面的设计。 为此,WPF 提供了几何图形。 下图演示了使用几何图形来创建可直接绘制、用作画笔或用于剪辑其他形状和控件的自定义形状。
- Path 对象可用于绘制封闭式或开放式形状、多个形状,甚至曲线形状。
- Geometry 对象可用于剪辑、命中测试以及呈现二维图形数据。
文本和版式
为了促进高质量的文本呈现,WPF 提供以下功能:
-
OpenType 字体支持。
-
ClearType 增强功能。
-
利用硬件加速的高性能。
-
文本与媒体、图形和动画的集成。
-
国际字体支持和回退机制。
WPF 中的树
-
逻辑树
- 在 WPF 中,通过为支持 UI 元素的对象设置属性,可以向这些 UI 元素添加内容。
-
借助逻辑树,内容模型可以方便地循环访问其可能的子对象,从而实现扩展。 此外,逻辑树还为某些通知提供框架,例如在加载逻辑树中的所有对象时。 基本上,逻辑树是框架级别的近似运行时对象图(排除了视觉对象),但其足以用于对你自己的运行时应用程序组合执行多种查询操作。
此外,静态和动态资源引用都通过向上查看初始请求Resources对象集合的逻辑树来解决,然后继续逻辑树并检查每个FrameworkElement(或FrameworkContentElement) 另一
Resources
ResourceDictionary个值,其中包含 可能包含该键。 当同时存在逻辑树和可视化树时,将使用逻辑树进行资源查找。
可视化树
- WPF 中除了逻辑树的概念,还存在可视化树的概念。 可视化树描述可视对象的结构,如Visual基类表示。 为控件编写模板时,将定义或重新定义适用于该控件的可视化树。
-
树、内容元素和内容宿主
内容元素(派生自 的ContentElement类)不是可视化树的一部分;因此,内容元素(派生自 的类)不是可视化树的一部分。它们不继承Visual,也没有可视表示形式。 为了在 UI 中显示 ,ContentElement必须在 既是Visual逻辑树参与者的内容主机中托管的。 通常这样的对象是 。 FrameworkElement 从概念上讲,内容宿主有些类似于内容的“浏览器”,它选择在该宿主控制的屏幕区域中显示内容的方式。 承载内容时,可以使内容成为通常与可视化树关联的某些树进程的参与者。 通常,FrameworkElement主机类包括实现代码,该代码通过内容ContentElement逻辑树的子节点将任何托管添加到事件路由,即使托管内容不是真正可视化树的一部分。 这是必要的,以便 可以ContentElement源路由到任何元素(而不是其自身)的路由事件。
-
树遍历
类LogicalTreeHelper提供GetChildrenGetParent逻辑树遍历FindLogicalNode的 和 方法。 在大多数情况下,不需要遍历现有控件的逻辑树,因为这些控件几乎总是将其逻辑子元素公开为一个专用集合属性,这种属性支持集合访问,如
Add
、索引器等等。 树遍历主要是一种方案,由选择不从预期控制模式(如已定义集合属性)或ItemsControlPanel已定义集合属性或打算提供自己的集合属性支持的控件作者使用的方案。
路由事件
- 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。
- 实现定义:路由事件是由类的实例支持的 CLR 事件,由 RoutedEvent Windows Presentation Foundation (WPF) 事件系统进行处理。
-
路由事件的顶级方案
-
控件的撰写和封装:WPF 中的各个控件都有一个丰富的内容模型。 例如,可以将图像置于内 Button ,这会有效地扩展按钮的可视化树。 但是,添加的图像不得中断导致按钮响应 Click 其内容的命中测试行为,即使用户单击了在技术上包含图像的部分像素也是如此。
单一处理程序附件点: 在 Windows 窗体中,你必须多次附加相同的处理程序,以处理可能会从多个元素引发的事件。 借助路由事件,可以只附加该处理程序一次(如上例中所示),并在必要时使用处理程序逻辑来确定该事件的源位置。 例如,这可以是前面显示的 XAML 的处理程序:
路由事件的实现方式
- 路由事件是由类的实例提供支持 RoutedEvent 并向事件系统注册的 CLR 事件 WPF 。 RoutedEvent从注册获得的实例通常作为
public
static
readonly
类的字段成员保留,此类成员注册并因此 "拥有" 路由事件。 与名称相同的 CLR 事件 (有时称为 "包装" 事件)的连接是通过重写add
CLR 事件的和实现来完成的remove
。 通常,add
和remove
保留为隐式默认值,该默认值使用特定于语言的相应事件语法来添加和删除该事件的处理程序。 路由事件支持和连接机制在概念 上 类似于依赖属性是由 DependencyProperty 类支持并向属性系统注册的 CLR 属性 WPF 。 - (未完待续)