.NET WPF 控件类分层结构
在 WPF 中,类的层级结构设计是为了实现线程安全、依赖属性、可视化渲染、布局和交互等功能。以下是 WPF 核心基类的逐级说明,从最底层到最顶层:
1 DispatcherObject
作用:
提供与 WPF 线程模型(Dispatcher)的集成,确保对象只能被创建它的线程访问(UI 线程)。
所有 WPF 对象必须继承自
DispatcherObject
,以保证线程安全。
核心方法:
CheckAccess()
:检查当前线程是否有权访问对象。VerifyAccess()
:如果当前线程无权访问,抛出异常。
示例场景:
- 当后台线程尝试修改 UI 元素时,必须通过
Dispatcher.Invoke
委托到 UI 线程。
- 当后台线程尝试修改 UI 元素时,必须通过
2 DependencyObject
继承自:
DispatcherObject
作用:
支持 依赖属性(Dependency Properties) 和 附加属性(Attached Properties)。
提供属性值继承、数据绑定、动画和样式的基础设施。
核心方法:
GetValue(DependencyProperty)
:获取依赖属性的值。SetValue(DependencyProperty, object)
:设置依赖属性的值。
关键特性:
- 依赖属性支持值继承、默认值、属性变更通知(通过
PropertyChangedCallback
)。
- 依赖属性支持值继承、默认值、属性变更通知(通过
示例场景:
Button
控件的Background
属性是一个依赖属性。
3 Visual
继承自:
DependencyObject
作用:
定义 WPF 可视化元素的渲染基础,提供基本的渲染能力(如坐标转换、命中测试)。
属于 WPF 可视化树(Visual Tree)的节点。
核心功能:
转换坐标(
TransformToVisual
)。命中测试(
HitTest
)。渲染到屏幕(通过
DrawingContext
)。
注意:
Visual
是低级的渲染抽象,开发中通常直接使用更高层的UIElement
。
4 UIElement
继承自:
Visual
作用:
提供 布局、输入、事件 等交互功能。
是 WPF 中所有可视化交互元素的基类。
核心功能:
布局系统:定义
Measure
和Arrange
方法,用于计算元素大小和位置。输入处理:支持鼠标、键盘、触控等输入事件(如
MouseDown
、KeyUp
)。焦点管理:
Focusable
属性和Focus()
方法。路由事件:通过事件冒泡和隧道机制(如
PreviewMouseDown
和MouseDown
)。
示例场景:
- 处理按钮的点击事件时,事件通过
UIElement
的路由机制传递。
- 处理按钮的点击事件时,事件通过
5 FrameworkElement
继承自:
UIElement
作用:
在
UIElement
基础上扩展了 数据绑定、样式、资源 等高级功能。提供更易用的布局属性和生命周期管理。
关键特性:
布局属性:
Margin
、HorizontalAlignment
、Width
等。数据绑定:通过
DataContext
和Binding
表达式。样式和模板:支持
Style
和ControlTemplate
。资源管理:
Resources
属性和FindResource
方法。生命周期事件:
Loaded
、Unloaded
。
示例场景:
- 使用
Style
定义一组控件的统一外观。
- 使用
6 Control
继承自:
FrameworkElement
作用:
所有交互式控件的基类(如
Button
、TextBox
)。提供 模板化 支持,允许自定义控件外观。
关键特性:
模板化:通过
ControlTemplate
定义控件视觉结构。内容模型:支持
Content
属性(如Button
的内容可以是任意对象)。样式和主题:默认集成系统主题。
示例场景:
- 自定义一个圆角按钮的模板。
7 层级关系总结
DispatcherObject → DependencyObject → Visual → UIElement → FrameworkElement → Control
8 各层级的设计意义
DispatcherObject
- 确保 WPF 的线程安全模型,所有 UI 操作必须通过 Dispatcher 调度到 UI 线程。
DependencyObject
- 实现依赖属性和附加属性,为数据绑定、动画和样式提供基础设施。
Visual
- 提供低级的渲染能力,支持可视化树和组合元素。
UIElement
- 处理输入、事件和布局,是交互功能的核心。
FrameworkElement
- 扩展布局和绑定功能,简化开发者的使用。
Control
- 封装可重用的交互式控件行为,支持模板化以实现灵活的外观定制。
通过这种层级设计,WPF 实现了从底层线程安全到高级控件功能的逐层抽象,开发者可以根据需求选择继承适当的基类。