基本元素概述

Windows Presentation Foundation(WPF)中的类比例较高,派生自 SDK 文档中通常称为基元素类的四个类。 这些类是UIElementFrameworkElementContentElementFrameworkContentElement。 该 DependencyObject 类也相关,因为它是 UIElementContentElement 的通用基类。

WPF 类中的基本元素 API

UIElementContentElement都派生自DependencyObject,通过稍微不同的途径。 此级别的拆分涉及用户界面中的使用方式UIElementContentElement以及它们在应用程序中的用途。 UIElement在其类层次结构中也具有Visual,它是一个类,用于公开基础的 Windows Presentation Foundation(WPF)较低级别的图形支持。 Visual 通过定义独立的矩形屏幕区域来提供呈现框架。 实际上,UIElement 适用于支持较大对象模型的元素,旨在将渲染和布局为可描述为矩形屏幕区域的区域,并且内容模型特意设计得更加开放,以允许不同元素的组合。 ContentElement 不源自 Visual。其模型是 ContentElement 会被其他内容(例如读取器或查看器)消耗,然后解释元素并生成完整的 Visual,供 Windows Presentation Foundation(WPF)使用。 某些 UIElement 类旨在成为内容主机:它们为一个或多个 ContentElementDocumentViewer (此类的示例)提供托管和呈现。 ContentElement 用作具有略小对象模型的元素的基类,并且更多用于处理可能托管在一个 UIElement内部的文本、信息或文档内容。

Framework-Level 和 Core-Level

UIElement 用作基类 FrameworkElement,并 ContentElement 用作基类 FrameworkContentElement。 推动创建下一个级别的课程的原因,是为了支持一个与 WPF 框架级别分开的 WPF 核心级别,这种划分还存在于 PresentationCore 和 PresentationFramework 程序集之间的 API 分隔方式中。 WPF 框架级别为基本应用程序需求提供了更完整的解决方案,包括用于演示的布局管理器的实现。 WPF 核心级别提供了一种使用许多 WPF 功能的方法,同时避免了附加程序集的资源开销。 对于大多数典型的应用程序开发方案,这些级别之间的区别很少重要,通常应该将 WPF API 视为一个整体,而不关心 WPF 框架级别与 WPF 核心级别之间的差异。 如果应用程序设计选择替换大量 WPF 框架级别功能,例如,如果整个解决方案已具有自己的用户界面(UI)组合和布局实现,则可能需要了解级别区别。

选择要从中派生的元素

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

如果您正在实现一个控件,这是 WPF 类派生的更常见原因之一,您可能希望从实用控件、控件族基类,或至少从 Control 基类派生。 有关一些指南和实践示例,请参阅 控件创作概述

如果您不打算创建控件,而是需要从层次结构中较高层次的类派生,可以参考以下部分,其中提供了每个基础元素类中定义的特征指南。

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

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

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

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

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

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

  • 可被重写的虚拟方法,用于向布局系统提供信息。

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

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

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

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

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

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

  • 支持实际的 WPF 框架级别的布局系统实现,包括一个 OnPropertyChanged 重载,它可以检测影响布局的属性的更改。

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

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

  • 支持样式和脚本设计。 有关详细信息,请参阅 Style动画概述

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

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

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

  • 您不继承对布局系统修改(如 ArrangeOverride)的访问权限。 布局系统实现仅适用于 FrameworkElement。 然而,您继承了一个OnPropertyChanged 重写,该重写可以检测到影响布局的属性的变更,并将这些变更报告给任何内容宿主。

已为各种类别记录内容模型。 如果想找到一个适合派生的类,类的内容模型是你应该考虑的一个可能因素。 有关详细信息,请参阅 WPF 内容模型

其他基类

调度器对象

DispatcherObject 为 WPF 线程模型提供支持,并使为 WPF 应用程序创建的所有对象都能够与 a Dispatcher相关联。 即使你不派生自 UIElementDependencyObjectVisual,你仍然应考虑派生自 DispatcherObject以获得此线程模型的支持。 有关详细信息,请参阅 线程模型

视觉对象

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

可冻结

Freezable 通过在需要不可变对象或出于性能原因需要不可变对象时,提供生成对象副本的方法来模拟可变对象中的不可变性。 该 Freezable 类型为某些图形元素(如几何图形和画笔以及动画)提供了一个常见基础。 值得注意的是,一个 Freezable 不是一个 Visual;它可以包含一些属性,这些属性在应用 Freezable 以填充另一个对象的属性值时,会变成子属性,这些子属性可能会影响呈现。 有关详细信息,请参阅 冻结对象概述

Animatable

Animatable 是一个 Freezable 派生类,专门添加动画控制层和一些实用工具成员,以便当前动画属性可以与非动画属性区分开来。

控制

Control 是各种称为控件或组件的对象的类型的预期基类,具体取决于技术。 通常,WPF 控件类是直接表示 UI 控件或密切参与控件组合的类。 启用的主要功能 Control 是控制模板化。

另请参阅