Windows Presentation Foundation (WPF) 中的大部分类都从四个类派生而来这四个类在 SDK 文档中常常被称为基元素类这些类包括 UIElementFrameworkElementContentElement 和 FrameworkContentElementDependencyObject 也是一个相关类因为它是 UIElement 和 ContentElement 的通用基类 WPF 类中的基元素 API UIElement 和 ContentElement 都是从 DependencyObject 派生而来但途径略有不同此级别上的拆分涉及到 UIElement 或 ContentElement 如何在用户界面上使用以及它们在应用程序起到什么作用UIElement 在其类层次结构中也有 Visual该类为 Windows Presentation Foundation (WPF) 公开较低级别的图形支持Visual 通过定义独立的矩形屏幕区域来提供呈现框架实际上UIElement 适用于支持大型数据模型的元素这些元素用于在可以称为矩形屏幕区域的区域内进行呈现和布局在该区域内内容模型特意设置得更加开放以允许不同的元素进行组合ContentElement 不是从 Visual 派生的它的模型由其他对象(例如阅读器或查看器用来解释元素并生成完整的 Visual 供 Windows Presentation Foundation (WPF) 使用)来使用 ContentElement某些 UIElement 类可用作内容宿主它们为一个或多个 ContentElement 类(如 DocumentViewer)提供宿主和呈现ContentElement 用作以下元素的基类所具有的对象模型较小并且多用于寻址可能宿主在 UIElement 中的文本信息或文档内容 框架级和核心级 UIElement 用作 FrameworkElement 的基类ContentElement 用作 FrameworkContentElement 的基类对于此下一级类原因是要支持与 WPF 框架级相分离的 WPF 核心级这种分离还存在于 API 如何在 PresentationCore 和 PresentationFramework 程序集之间进行划分WPF 框架级为基本应用程序需要提供了一个更完整的解决方案包括用于表示的布局管理器的实现WPF 核心级提供了一种方法以充分利用 WPF而又不至于产生附加程序集开销对于大多数典型的应用程序开发方案而言这些级别之间的区别很少有影响而且一般情况下应将 WPF API 视为一个整体而无需担心 WPF 框架级与 WPF 核心级之间有何区别如果您的应用程序设计选择替换大量 WPF 框架级功能例如如果您的整体解决方案已经有其自己的用户界面 (UI) 组合和布局实现则可能需要了解级别之间的差异 选择从哪个元素派生 创建用于扩展 WPF 的自定义类的最实用方法是从某个 WPF 类中派生这样您可以通过现有的类层次结构获得尽可能多的所需功能本节列出了三个最重要的元素类附带的功能以帮助您决定要从哪个类进行派生 如果您要实现控件(这的确是从 WPF 类派生的更常见的原因之一)您可能需要从以下类中派生实际控件控件系列基类或至少是 Control 基类 如果您不是创建控件并且需要从层次结构中较高的类进行派生 则可以参考下列各节的内容了解每个基元素类定义了哪些特征 如果您创建从 DependencyObject 派生的类则将继承以下功能 GetValue 和 SetValue 支持以及一般的属性系统支持 使用依赖项属性以及作为依赖项属性实现的附加属性的能力 如果您创建从 UIElement 派生的类则除了能够继承 DependencyObject 提供的功能外还将继承以下功能 对动画属性值的基本支持 对基本输入事件和命令的支持 可以重写以便为布局系统提供信息的虚方法 如果您创建从 FrameworkElement 派生的类则除了能够继承 UIElement 提供的功能外还将继承以下功能 对样式设置和演示图板的支持 对数据绑定的支持 对动态资源引用的支持 对属性值继承以及元数据中有助于向框架服务报告属性的相关情况(如数据绑定样式或布局的框架实现)的其他标志的支持 逻辑树的概念 对布局系统的实际 WPF 框架级实现的支持包括 OnPropertyChanged 重写(该重写可以检测到影响布局的属性更改) 如果您创建从 ContentElement 派生的类则除了能够继承 DependencyObject 提供的功能外还将继承以下功能 对动画的支持 对基本输入事件和命令的支持 如果您创建从 FrameworkContentElement 派生的类则除了能够继承 ContentElement 提供的功能外还将获得以下功能 对样式设置和演示图板的支持 对数据绑定的支持 对动态资源引用的支持 对属性值继承以及元数据中有助于向框架服务报告属性情况(如数据绑定样式或布局的框架实现)的其他标志的支持 您不会继承对布局系统修改(如 ArrangeOverride)的访问权限布局系统实现只在 FrameworkElement 上提供但是您会继承 OnPropertyChanged 重写(可以检测影响布局的属性更改并将这些更改报告给任何内容宿主) 记录了各种类的内容模型如果您要找到一个合适的类以便从该类进行派生其内容模型是一个应该考虑的可能因素 其他基类 DispatcherObject DispatcherObject 为 WPF 线程模型提供支持并允许为 WPF 应用程序创建的所有对象与 Dispatcher 相关联即使您不从 UIElement DependencyObject 或 Visual 派生也应考虑从 DispatcherObject 派生以获得此线程模型支持 Visual Visual 实现二维对象在近似矩形的区域中通常需要具有可视化表示的概念Visual 的实际呈现发生在其他类中(不是独立的)但是 Visual 类提供了一个由各种级别的呈现处理使用的已知类型Visual 实现命中测试但它不公开报告命中测试结果的事件(这些都位于 UIElement 中) Freezable Freezable 通过在出于性能原因需要不可变对象时提供为对象生成副本的途径来模拟可变对象的不变性Freezable 类型为某些图形元素(如几何形状画笔以及动画)提供了一个通用的基础值得注意的是Freezable 不是一个 Visual当应用 Freezable 以填充另一个对象的属性值时它包含的属性将变成子属性而这些子属性可能会影响呈现 Animatable Animatable 是一个 Freezable 派生类它特别添加了动画控件层和某些实用工具成员从而使当前动画的属性可以与未动画的属性区分开 Control Control 是称为控件或组件(取决于技术)的对象类型的理想基类一般而言WPF 控件类是直接表示 UI 控件或积极参与控件组合的类Control 实现的主要功能是控件模板化 |