框架属性元数据 (WPF .NET)

可以在 Windows Presentation Foundation (WPF) 框架级别为依赖属性设置框架属性元数据选项。 当 WPF 演示 API 和可执行文件处理呈现和数据绑定时,WPF 框架级别规定适用。 演示 API 和可执行文件查询依赖属性的 FrameworkPropertyMetadata

先决条件

本文假设对依赖属性有一个基本的了解,并且你已阅读 依赖项属性概述。 若要遵循本文中的示例,如果熟悉可扩展应用程序标记语言(XAML),并且知道如何编写 WPF 应用程序,则很有帮助。

框架属性元数据类别

FrameworkPropertyMetadata 属于以下类别:

  • 影响元素布局的元数据,特别是 AffectsArrangeAffectsMeasureAffectsRender 元数据标志。 如果你的依赖属性实现影响了视觉效果,并且在类中实现了 MeasureOverrideArrangeOverride,则可以设置这些标志。 MeasureOverrideArrangeOverride 方法向布局系统提供特定于实现的行为和呈现信息。 当在依赖属性的元数据中将 AffectsArrangeAffectsMeasureAffectsRender 设置为 true,并且其有效值发生更改时,WPF 属性系统将启动请求,使元素的视觉对象失效以触发重绘。

  • 影响元素父元素布局的元数据,特别是 AffectsParentArrangeAffectsParentMeasure 元数据标志。 设置这些标志的 WPF 依赖项属性的示例是 FixedPage.LeftParagraph.KeepWithNext

  • 属性值继承元数据,特别是 InheritsOverridesInheritanceBehavior 元数据标志。 默认情况下,依赖属性不会继承值。 OverridesInheritanceBehavior 允许继承路径也进入可视化树,这是某些控件组合方案所必需的。 有关详细信息,请参阅 属性值继承

    说明

    属性值上下文中的术语“继承”特定于依赖属性,与托管代码类型和通过派生类型的成员继承没有直接关系。 在依赖属性的上下文中,这意味着子元素可以从父元素继承依赖属性值。

  • 数据绑定元数据,特别是 BindsTwoWayByDefaultIsNotDataBindable 元数据标志。 默认情况下,WPF 框架中的依赖项属性支持单向绑定。 考虑将双向绑定设置为报告状态且可通过用户操作来修改的属性的默认设置,例如 IsSelected。 此外,请考虑将双向绑定设置为默认值,当控件的用户期望属性实现它时,例如 TextBox.TextBindsTwoWayByDefault 仅影响默认绑定模式。 若要编辑绑定的数据流方向,请设置 Binding.Mode。 当没有用例时,可以使用 IsNotDataBindable 来禁用数据绑定。 有关数据绑定的详细信息,请参阅 数据绑定概述

  • 日志元数据,特别是 Journal 元数据标志。 仅对于某些依赖属性(如 SelectedIndex),Journal 标志的默认值才为 true。 用户输入控件应为其值包含需要存储的用户选择的属性设置 Journal 标志。 支持日记的应用程序或服务(包括 WPF 日记服务)读取 Journal 标志。 有关存储导航步骤的信息,请参阅 导航概述

FrameworkPropertyMetadata 直接从 UIPropertyMetadata派生,并实现此处讨论的标志。 除非专门设置,否则 FrameworkPropertyMetadata 标志的默认值为 false

读取 FrameworkPropertyMetadata

若要检索依赖属性的元数据,请对 DependencyProperty 标识符调用 GetMetadataGetMetadata 调用返回 PropertyMetadata 对象。 如果需要查询框架元数据值,请将 PropertyMetadata 强制转换为 FrameworkPropertyMetadata

指定 FrameworkPropertyMetadata

注册依赖属性时,可以选择创建和分配元数据。 分配的元数据对象可以是 PropertyMetadata 或其派生类之一,例如 FrameworkPropertyMetadata。 对于依赖于 WPF 演示文稿 API 和可执行文件进行呈现和数据绑定的依赖属性,请选择 FrameworkPropertyMetadata。 更高级的选项是派生自 FrameworkPropertyMetadata,以创建具有更多标志的自定义元数据报告类。 或者,可以将 UIPropertyMetadata 用于影响 UI 呈现的非框架属性。

尽管元数据选项通常在注册新的依赖属性期间设置,但可以在 OverrideMetadataAddOwner 调用中重新指定这些选项。 重写元数据时,始终使用在属性注册期间使用的相同元数据类型进行重写。

FrameworkPropertyMetadata 公开的属性特征有时称为标记。 如果要创建 FrameworkPropertyMetadata 实例,可通过两种方法填充标志值:

  1. FrameworkPropertyMetadataOptions 枚举类型的实例上设置标志。 FrameworkPropertyMetadataOptions 允许按位“或”组合指定元数据标志。 然后,使用具有 FrameworkPropertyMetadataOptions 参数的构造函数实例化 FrameworkPropertyMetadata,并传入 FrameworkPropertyMetadataOptions 实例。 若要在将 FrameworkPropertyMetadataOptions 传递到 FrameworkPropertyMetadata 构造函数后更改元数据标志,请更改新 FrameworkPropertyMetadata 实例上的相应属性。 例如,如果设置 FrameworkPropertyMetadataOptions.NotDataBindable 标志,可以通过将 FrameworkPropertyMetadata.IsNotDataBindable 设置为 false来撤消该标志。

  2. 使用没有 FrameworkPropertyMetadataOptions 参数的构造函数实例化 FrameworkPropertyMetadata,然后在 FrameworkPropertyMetadata上设置适用的 Boolean 标志。 在将 FrameworkPropertyMetadata 实例与依赖属性关联之前设置标志值,否则将出现 InvalidOperationException

元数据替代行为

重写框架属性元数据时,修改后的元数据值要么替换原始值,要么与原始值合并:

  • 对于 PropertyChangedCallback,默认合并逻辑会保留表中以前的 PropertyChangedCallback 值,所有值都会在属性更改时调用。 回调顺序由类深度确定,其中层次结构中基类注册的回调将首先运行。 继承的回调仅运行一次,并且由将它们添加到元数据中的类拥有。

  • 对于 DefaultValue,新值将替换现有的默认值。 如果未在替代元数据中指定 DefaultValue,并且现有的 FrameworkPropertyMetadata 已设置 Inherits 标志,则该默认值来自在元数据中指定 DefaultValue 的最近上级。

  • 对于 CoerceValueCallback,新值将替换现有的 CoerceValueCallback 值。 如果未在替代元数据中指定 CoerceValueCallback,则该值来自指定 CoerceValueCallback 的继承链中最近的上级。

  • 对于 FrameworkPropertyMetadata 非继承的标志,可以使用 true 值替代默认 false 值。 但对于 InheritsJournalOverridesInheritanceBehaviorSubPropertiesDoNotAffectRender,只能使用 false 值替代 true 值。

说明

默认合并逻辑由 Merge 方法实现。 你可以在继承依赖属性的派生类中指定自定义合并逻辑,方法是替代该类中的 Merge

另请参阅