基元素概述

Windows Presentation Foundation (WPF) 中较高比重的类都派生自四类,它们通常在 SDK 文档中称为基元素。 这些类分别是:UIElementFrameworkElementContentElementFrameworkContentElementDependencyObject 类也相关,因为它属于 UIElementContentElement 的常见基类

WPF 类中的基元素 API

UIElementContentElement 都派生自 DependencyObject,但通过的路径略有不同。 以此级别进行拆分解决 UIElementContentElement 在用户界面中如何使用以及它们在应用程序中的用途问题。 UIElement 在其类层次结构中还有 Visual,该类以 Windows Presentation Foundation (WPF) 为基础,公开低级别图形支持。 Visual 通过定义独立矩形屏幕区域提供呈现框架。 在实践中,UIElement 适用于支持较大对象模型的元素,专用于呈现和布局到可描述为矩形屏幕区域的区域,在该区域中,有意将内容模型设置得更加开放,以允许不同的元素组合。 ContentElement 未派生自 Visual;其模型为 ContentElement 将由其他对象使用,如读取器或查看器随后可解释元素并生成完整的 Visual 供 Windows Presentation Foundation (WPF) 使用。 某些 UIElement 类旨在成为内容宿主:它们为一个或多个 ContentElement 类提供承载和呈现服务(DocumentViewer 即属于此类)。 ContentElement 用作具有较小对象模型的元素的基类,这些元素更多地处理可能在 UIElement 中承载的文本、信息或文档内容。

框架级别和核心级别

UIElement 作为 FrameworkElement 的基类,ContentElement 作为 FrameworkContentElement 的基类。 此下一级别类的目的是支持独立于 WPF 框架级别的 WPF 核心级别,这种划分也存在于 API 在 PresentationCore 与 PresentationFramework 程序集之间的划分方式。 WPF 框架级别表示一种更完整的解决方案,以满足基本应用程序需求,其中包括实现演示文稿的布局管理器。 WPF 核心级别可提供一种方法,使你能够充分利用它,而无需承担其他程序集的开销。 这些级别间的区别对大多数典型的应用程序开发方案几乎没影响,但一般情况下,你应整体考虑 WPF API,而不是关注 WPF 框架级别和 WPF 核心级别间的差异。 如果应用程序设计选择替换大量 WPF 框架级别功能,建议了解级别差异,例如,整体解决方案是否已有其自己的用户界面 (UI) 组合和布局的实现。

选择要从其中派生的元素

若要创建扩展 WPF 的自定义类,最实用的方法是派生自 WPF 类之一,你可在其中通过现有类层次结构获得尽可能多的所需功能。 本节列出了以下三个最重要的元素类附带的功能,以帮助决定要从其中继承的类。

若要实现控件(这实际上是从 WPF 类派生的更常见的一种理由),建议从属于实用控件的类、控件系列基类派生或至少从 Control 基类派生。 有关指导和实际示例,请参阅控件创作概述

如果没有创建控件且需要派生自位于层次结构中较高层次的类,以下各节可用于指导在每个基元素类中定义哪些特征。

如果创建派生自 DependencyObject 的类,将继承以下功能:

  • GetValueSetValue 支持,以及以及常规属性系统支持。

  • 能够使用依赖属性和实现为依赖属性的附加属性。

如果创建派生自 UIElement 的类,除 DependencyObject 提供的功能外,还将继承以下功能:

  • 对已动画处理的属性值的基本支持。 有关详细信息,请参阅 动画概述

  • 基本输入事件支持以及命令支持。 有关详细信息,请参阅输入概述命令概述

  • 可进行替代以便介绍布局系统的虚拟方法。

如果创建派生自 FrameworkElement 的类,除 UIElement 提供的功能外,还将继承以下功能:

  • 样式和情节提要支持。 有关详细信息,请参阅 Style情节提要概述

  • 数据绑定支持。 有关详细信息,请参阅 数据绑定概述

  • 动态资源引用支持。 有关详细信息,请参阅 XAML 资源

  • 属性值继承支持,以及元数据中的其他标记,这些标记有助于报告关于框架服务属性的情况,例如数据绑定、样式或布局的框架实现。 有关详细信息,请参阅框架属性元数据

  • 逻辑树概念。 有关详细信息,请参见 WPF 中的树

  • 支持布局系统的实用 WPF 框架级别的实现,包括可检测对影响布局的属性的更改的 OnPropertyChanged 替代。

如果创建派生自 ContentElement 的类,除 DependencyObject 提供的功能外,还将继承以下功能:

如果创建派生自 FrameworkContentElement 的类,除 ContentElement 提供的功能外,还将获取以下功能:

  • 样式和情节提要支持。 有关详细信息,请参阅 Style动画概述

  • 数据绑定支持。 有关详细信息,请参阅 数据绑定概述

  • 动态资源引用支持。 有关详细信息,请参阅 XAML 资源

  • 属性值继承支持,以及元数据中的其他标记,这些标记有助于报告关于框架服务属性的情况,例如数据绑定、样式或布局的框架实现。 有关详细信息,请参阅框架属性元数据

  • 你不会继承布局系统修改权限(例如 ArrangeOverride)。 布局系统实现仅对 FrameworkElement 适用。 但是,你将继承 OnPropertyChanged 替代,该替代可检测影响布局的属性的更改并将这些更改报告给任何内容宿主。

针对各种类记录内容模型。 如果想要查找相应的类进行派生,类的内容模型是应该考虑的一个可能因素。 有关详细信息,请参阅 WPF 内容模型

其他基类

DispatcherObject

DispatcherObject 提供对 WPF 线程模型的支持,且使所有为 WPF 应用程序创建的对象都能够与 Dispatcher 关联。 即使不从 UIElementDependencyObjectVisual 派生,也应考虑从 DispatcherObject 派生,以便获得该线程模型支持。 有关详细信息,请参阅线程模型

可视

Visual 实现了 2D 对象的概念,这种概念通常要求在大致矩形区域中进行视觉呈现。 Visual 的实际呈现发生在其他类(非自包含)中,但 Visual 类提供了一种已知类型,供各个级别的呈现进程使用。 Visual 实现命中测试,但它不公开报告命中测试阳性的事件(位于 UIElement 中)。 有关详细信息,请参阅可视化层编程

Freezable

当出于性能原因要求或需要不可变对象时,Freezable 通过提供生成对象副本的方式来模拟可变对象的不可变性。 Freezable 类型为某些图形元素(如几何图形、画笔以及动画)提供公共基础。 值得注意的是,Freezable 不是 Visual;当应用 Freezable 填充其他对象的属性值时,它可保留成为子属性的属性,而这些子属性可能会影响呈现。 有关详细信息,请参阅 Freezable 对象概述

Animatable

AnimatableFreezable 派生类,它特别添加了动画控件层和一些实用程序成员,以便可以区分当前已动画处理属性和未动画处理属性。

控制

Control 属于称为控件或组件的对象类型的目标基类,具体视技术而定。 通常,WPF 控件类是直接表示 UI 控件或积极参与控件组合的类。 Control 实现的主要功能是控件模板化。

另请参阅