可以在 Windows Presentation Foundation (WPF) 框架级别为依赖属性设置框架属性元数据选项。 当 WPF 演示 API 和可执行文件处理呈现和数据绑定时,WPF 框架级别规定适用。 演示 API 和可执行文件查询依赖属性的 FrameworkPropertyMetadata。
先决条件
本文假设对依赖属性有一个基本的了解,并且你已阅读 依赖项属性概述。 若要遵循本文中的示例,如果熟悉可扩展应用程序标记语言(XAML),并且知道如何编写 WPF 应用程序,则很有帮助。
框架属性元数据类别
FrameworkPropertyMetadata 属于以下类别:
影响元素布局的元数据,特别是 AffectsArrange、AffectsMeasure和 AffectsRender 元数据标志。 如果你的依赖属性实现影响了视觉效果,并且在类中实现了 MeasureOverride 或 ArrangeOverride,则可以设置这些标志。
MeasureOverride
和ArrangeOverride
方法向布局系统提供特定于实现的行为和呈现信息。 当在依赖属性的元数据中将AffectsArrange
、AffectsMeasure
或AffectsRender
设置为true
,并且其有效值发生更改时,WPF 属性系统将启动请求,使元素的视觉对象失效以触发重绘。影响元素父元素布局的元数据,特别是 AffectsParentArrange 和 AffectsParentMeasure 元数据标志。 设置这些标志的 WPF 依赖项属性的示例是 FixedPage.Left 和 Paragraph.KeepWithNext。
属性值继承元数据,特别是 Inherits 和 OverridesInheritanceBehavior 元数据标志。 默认情况下,依赖属性不会继承值。 OverridesInheritanceBehavior 允许继承路径也进入可视化树,这是某些控件组合方案所必需的。 有关详细信息,请参阅 属性值继承。
注释
属性值上下文中的术语“继承”特定于依赖属性,与托管代码类型和通过派生类型的成员继承没有直接关系。 在依赖属性的上下文中,这意味着子元素可以从父元素继承依赖属性值。
数据绑定元数据,特别是 BindsTwoWayByDefault 和 IsNotDataBindable 元数据标志。 默认情况下,WPF 框架中的依赖项属性支持单向绑定。 考虑将双向绑定设置为报告状态且可通过用户操作来修改的属性的默认设置,例如 IsSelected。 此外,请考虑将双向绑定设置为默认值,当控件的用户期望属性实现它时,例如 TextBox.Text。
BindsTwoWayByDefault
仅影响默认绑定模式。 若要编辑绑定的数据流方向,请设置 Binding.Mode。 当没有用例时,可以使用IsNotDataBindable
来禁用数据绑定。 有关数据绑定的详细信息,请参阅 数据绑定概述。日志元数据,特别是 Journal 元数据标志。 仅对于某些依赖属性(如
Journal
),true
标志的默认值才为 SelectedIndex。 用户输入控件应为其值包含需要存储的用户选择的属性设置Journal
标志。 支持日记的应用程序或服务(包括 WPF 日记服务)读取Journal
标志。 有关存储导航步骤的信息,请参阅 导航概述
FrameworkPropertyMetadata 直接从 UIPropertyMetadata派生,并实现此处讨论的标志。 除非专门设置,否则 FrameworkPropertyMetadata
标志的默认值为 false
。
读取 FrameworkPropertyMetadata
若要检索依赖属性的元数据,请对 GetMetadata 标识符调用 DependencyProperty。
GetMetadata
调用返回 PropertyMetadata
对象。 如果需要查询框架元数据值,请将 PropertyMetadata
强制转换为 FrameworkPropertyMetadata。
指定 FrameworkPropertyMetadata
注册依赖属性时,可以选择创建和分配元数据。 分配的元数据对象可以是 PropertyMetadata 或其派生类之一,例如 FrameworkPropertyMetadata。 对于依赖于 WPF 演示文稿 API 和可执行文件进行呈现和数据绑定的依赖属性,请选择 FrameworkPropertyMetadata
。 更高级的选项是派生自 FrameworkPropertyMetadata
,以创建具有更多标志的自定义元数据报告类。 或者,可以将 UIPropertyMetadata 用于影响 UI 呈现的非框架属性。
尽管元数据选项通常在注册新的依赖属性期间设置,但可以在 OverrideMetadata 或 AddOwner 调用中重新指定这些选项。 重写元数据时,始终使用在属性注册期间使用的相同元数据类型进行重写。
FrameworkPropertyMetadata
公开的属性特征有时称为标记。 如果要创建 FrameworkPropertyMetadata
实例,可通过两种方法填充标志值:
在 FrameworkPropertyMetadataOptions 枚举类型的实例上设置标志。
FrameworkPropertyMetadataOptions
允许按位“或”组合指定元数据标志。 然后,使用具有FrameworkPropertyMetadata
参数的构造函数实例化FrameworkPropertyMetadataOptions
,并传入FrameworkPropertyMetadataOptions
实例。 若要在将FrameworkPropertyMetadataOptions
传递到 FrameworkPropertyMetadata 构造函数后更改元数据标志,请更改新FrameworkPropertyMetadata
实例上的相应属性。 例如,如果设置 FrameworkPropertyMetadataOptions.NotDataBindable 标志,可以通过将 FrameworkPropertyMetadata.IsNotDataBindable 设置为false
来撤消该标志。使用没有
FrameworkPropertyMetadata
参数的构造函数实例化FrameworkPropertyMetadataOptions
,然后在 Boolean上设置适用的FrameworkPropertyMetadata
标志。 在将FrameworkPropertyMetadata
实例与依赖属性关联之前设置标志值,否则将出现 InvalidOperationException。
元数据替代行为
重写框架属性元数据时,修改后的元数据值要么替换原始值,要么与原始值合并:
对于 PropertyChangedCallback,默认合并逻辑会保留表中以前的
PropertyChangedCallback
值,所有值都会在属性更改时调用。 回调顺序由类深度确定,其中层次结构中基类注册的回调将首先运行。 继承的回调仅运行一次,并且由将它们添加到元数据中的类拥有。对于 DefaultValue,新值将替换现有的默认值。 如果未在替代元数据中指定
DefaultValue
,并且现有的 FrameworkPropertyMetadata 已设置Inherits
标志,则该默认值来自在元数据中指定DefaultValue
的最近上级。对于 CoerceValueCallback,新值将替换现有的
CoerceValueCallback
值。 如果未在替代元数据中指定CoerceValueCallback
,则该值来自指定CoerceValueCallback
的继承链中最近的上级。对于
FrameworkPropertyMetadata
非继承的标志,可以使用false
值替代默认true
值。 但对于true
、false
、Inherits 和 Journal,只能使用 OverridesInheritanceBehavior 值替代 SubPropertiesDoNotAffectRender 值。
注释
默认合并逻辑由 Merge 方法实现。 你可以在继承依赖属性的派生类中指定自定义合并逻辑,方法是替代该类中的 Merge
。