.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 层级关系总结
text
DispatcherObject → DependencyObject → Visual → UIElement → FrameworkElement → Control
8 各层级的设计意义
-
DispatcherObject
- 确保 WPF 的线程安全模型,所有 UI 操作必须通过 Dispatcher 调度到 UI 线程。
-
DependencyObject
- 实现依赖属性和附加属性,为数据绑定、动画和样式提供基础设施。
-
Visual
- 提供低级的渲染能力,支持可视化树和组合元素。
-
UIElement
- 处理输入、事件和布局,是交互功能的核心。
-
FrameworkElement
- 扩展布局和绑定功能,简化开发者的使用。
-
Control
- 封装可重用的交互式控件行为,支持模板化以实现灵活的外观定制。
通过这种层级设计,WPF 实现了从底层线程安全到高级控件功能的逐层抽象,开发者可以根据需求选择继承适当的基类。