[No0000171]wpf 类层次结构Class Hierarchy
1.DispatcherObject类表示具有相关联的对象分派器。调度程序处理要在特定线程上执行工作的请求队列。它能够在其关联的线程上调用方法。
DispatcherObject是对象的基类,用于跟踪与创建它们的线程关联的Dispatcher。
WPF控件继承自DispatcherObject,因为它们需要从创建它们的线程调用它们的方法。
DispatcherObject有两个方法可以帮助确保从正确的线程调用控件的方法。
- CheckAccess - 检查当前线程是否可以调用控件上的方法
- VerifyAccess - 如果没有访问权限,则抛出InvalidOperationException
如果控件确定当前线程没有访问权限,则可以使用其Dispatcher属性(也在DispatcherObject中)在正确的线程上调用方法。
2.DependencyObject是支持依赖项属性的类的基类。
WPF中的依赖项属性类似于标准CLR属性,但功能更强大。依赖属性:
- 从许多不同来源中的一个获取它们的值
- 支持属性值的继承
- 属性值更改时的支持通知
如果一个类派生自DependencyObject,那么该类可以注册自己的依赖项属性并调用方法来获取/设置其依赖项属性的值。
3.Visual是表示可以呈现给WPF窗口或页面的对象的所有类的基类。它为命中测试,剪切和坐标转换提供支持,并为窗口或页面呈现自身。它还通过VisualParent属性和GetVisualChild方法模拟对象在WPF可视化树中的参与。
的视觉类也可用于实现新的(轻量)WPF控制的起始点。
4.UIElement类继承自视觉和增加了基本的用户交互行为,包括支持:
- 布局行为
- 父/子关系
- 测量/排列通行证
- 响应用户输入
- 从键盘/鼠标等设备输入事件
- 命令绑定
- 管理焦点
- 触发(并响应)路由事件
- 事件冒泡(向上)或隧道(向下)元素树
注意形成的首字母缩略词,这有助于思考UIElement - FrameworkElement与FrameworkContentElement
FrameworkElement(FE)派生自UIElement。FrameworkContentElement(FCE)派生自ContentElement。由于框架不是基于支持多重继承的语言(感谢上帝!),因此分歧是必要的。每个FE都有一些你不想要的ContentElement部分,并且每个FCE都有你不想要的UIElement部分。
FCE基本上存在以支持文本格式化引擎(可以在MS.Internal.Text命名空间中找到)。有一些非文本类派生自FCE,但他们这样做只是为了轻量级。
目标是使处理FE和FCE的编程体验尽可能相似。如果还有的话,我认为这使得框架更加优雅。
您可以将FCE视为具有FE的所有内容,除了支持布局/渲染。当然,这不是一个小功能,你肯定不希望每个文本元素都有这种开销。如果您尝试使用WPF的布局引擎渲染每个文本笔划,请想象一下,如果您试图使用WPF的布局引擎来渲染每一个文本的笔画,那么文本就太复杂了。
没错,看到在两个完全不同的基类上定义的完全相同的属性,方法,接口,事件等是很奇怪的。但我想一般反应仅仅是耸耸肩。只要微软愿意维护代码,我就没有问题。(事实上,在构建过程中,类之间共享的大部分代码都是代码生成的,所以它们对于维护它们并不困难......聪明的人!)
旁注:IFE与LIFE:我们过去使用的助记符是“LIEE从UIElement开始”。也就是说,每个UIElement都支持布局,输入,焦点和事件 Layout, Input, Focus, and Events。ContentElement为您提供除“L”之外的所有内容。因此,FE和FCE之间的功能交叉是IFE部分。
如果您想以多态方式处理框架对象的IFE部分,我建议创建一个帮助器类。实现起来很容易......实际上,您可以从内部FrameworkObject类中窃取大部分实现。
5.FrameworkElement的类继承自的UIElement并且又在WPF的所有控件的父类。
FrameworkElement构建于UIElement之上,并添加了以下功能:
- 布局 - 通过实现HorizontalAlignment,MinWidth和Margin等属性来实现布局模型
- 通过BeginStoryboard方法支持动画
- 数据绑定
- 用于绑定的数据模板
- 样式
FrameworkElement也是将添加到逻辑树(包含用户界面的可视对象的层次结构)的对象的主基类。
6.Control class控制类继承自FrameworkElement并且是用于所有用户交互控件的基类。控件的示例包括:TextBox,Label,ListBox,ComboBox和Button。Panel和Grid等容器元素不是控件。
控制类扩展FrameworkElement的功能:
- 通过使用模板更改控件的可视外观
- 支持字体,边框和背景颜色等可视元素
7.内容控件ContentControl,可以包含一个表示其内容的嵌套元素。由于嵌套元素可以是任何内容,因此从ContentControl派生的控件可以存储各种不同类型的内容。
内容控件具有Content属性,该属性指向它们包含的单个元素。该元素通常是UIElement,但可以是任何.NET对象。
这是一个示例,CheckBox使用DatePicker作为其内容。
<CheckBox Height="31" HorizontalAlignment="Center" Name="checkBox1" VerticalAlignment="Center"> <DatePicker Name="datePicker1" /> </CheckBox>
请注意,因为Window类是内容控件,所以Window只可能有一个子元素。
您可以在内容控件中有效地包含一组控件,方法是将单个容器对象作为其内容包含在内,该容器对象又包含其他元素。(例如,一个Button可以包含一个StackPanel,然后包含其他元素)。
8.ItemsControl是另一个从Control继承的WPF类,用作其他控件的基类。从ItemsControl继承的控件显示项集合。
从ItemsControl派生的控件通常使用数据绑定获取要显示的项列表,绑定到实现IEnumerable的对象。
直接或间接从ItemsControl继承的控件包括:Menu,ContextMenu,ComboBox,ListBox,ListView,TabControl,DataGrid,StatusBar,ToolBar和TreeView。