基元素概述
更新:2007 年 11 月
Windows Presentation Foundation (WPF) 中的大部分类都从四个类派生而来,这四个类在 SDK 文档中常常被称为基元素类。这些类包括 UIElement、FrameworkElement、ContentElement 和 FrameworkContentElement。DependencyObject 也是一个相关类,因为它是 UIElement 和 ContentElement 的通用基类。
本主题包括下列各节。
- WPF 类中的基元素 API
- 选择从哪个元素派生
- 其他基类
- 相关主题
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,而又不至于产生附加程序集开销。对于大多数典型的应用程序开发方案而言,这些级别之间的区别很少有影响,而且一般情况下应将 WPFAPI 视为一个整体,而无需担心 WPF 框架级与 WPF 核心级之间有何区别。如果您的应用程序设计选择替换大量 WPF 框架级功能,例如,如果您的整体解决方案已经有其自己的用户界面 (UI) 组合和布局实现,则可能需要了解级别之间的差异。
选择从哪个元素派生
创建用于扩展 WPF 的自定义类的最实用方法是从某个 WPF 类中派生,这样您可以通过现有的类层次结构获得尽可能多的所需功能。本节列出了三个最重要的元素类附带的功能,以帮助您决定要从哪个类进行派生。
如果您要实现控件(这的确是从 WPF 类派生的更常见的原因之一),您可能需要从以下类中派生:实际控件、控件系列基类或至少是 Control 基类。有关部分指导信息和实用示例,请参见控件创作概述。
如果您不是创建控件,并且需要从层次结构中较高的类进行派生,则可以参考下列各节的内容,了解每个基元素类定义了哪些特征。
如果您创建从 DependencyObject 派生的类,则将继承以下功能:
如果您创建从 UIElement 派生的类,则除了能够继承 DependencyObject 提供的功能外,还将继承以下功能:
如果您创建从 FrameworkElement 派生的类,则除了能够继承 UIElement 提供的功能外,还将继承以下功能:
对数据绑定的支持。有关更多信息,请参见数据绑定概述。
对动态资源引用的支持。有关更多信息,请参见资源概述。
对属性值继承以及元数据中有助于向框架服务报告属性的相关情况(如数据绑定、样式或布局的框架实现)的其他标志的支持。有关更多信息,请参见框架属性元数据。
逻辑树的概念。有关更多信息,请参见 WPF 中的树。
对布局系统的实际 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 以填充另一个对象的属性值时,它包含的属性将变成子属性,而这些子属性可能会影响呈现。有关更多信息,请参见Freezable 对象概述。
Animatable 是一个 Freezable 派生类,它特别添加了动画控件层和某些实用工具成员,从而使当前动画的属性可以与未动画的属性区分开。
Control
Control 是称为控件或组件(取决于技术)的对象类型的理想基类。一般而言,WPF 控件类是直接表示 UI 控件或积极参与控件组合的类。Control 实现的主要功能是控件模板化。