框架属性元数据
对于 Windows Presentation Foundation (WPF) 体系结构中被视为 WPF 框架级的对象元素的属性,报告框架属性元数据选项。 通常,WPF 框架级指示要求 WPF 演示 API 和可执行文件处理呈现、数据绑定和属性系统优化等功能。 这些系统对框架属性元数据进行查询,以便为特定的元素属性确定特定于功能的特征。
先决条件
本主题假设你作为 Windows Presentation Foundation (WPF) 类上现有依赖属性的使用者已经对依赖属性有所了解,并且已阅读了依赖属性概述。 另外,应当已阅读依赖属性元数据。
框架属性元数据传达的信息
框架属性元数据分为以下类别:
报告影响某个元素的布局属性(AffectsArrange、AffectsMeasure、AffectsRender)。 如果属性对这些相应的方面存在影响并且你还在你的类中实现了 MeasureOverride / ArrangeOverride 方法以向布局系统提供特定的呈现行为和信息,则可以在元数据中设置这些标志。 通常,如果在属性元数据中有布局属性为 true,则此类实现会在依赖属性中检查属性是否无效,并且只有无效属性才必须请求新的布局处理过程。
报告影响元素的父元素的布局属性(AffectsParentArrange、AffectsParentMeasure)。 默认设置了这些标志的部分示例包括 FixedPage.Left 和 Paragraph.KeepWithNext。
Inherits。 默认情况下,依赖属性不会继承值。 OverridesInheritanceBehavior 允许将继承的路径也纳入可视化树,这对于某些控件复合方案来说是必需的。
注意
属性值上下文中的术语“继承”是指特定于依赖属性的情况;它意味着由于存在 WPF 属性系统的 WPF 框架级功能,子元素可以从父元素继承实际的依赖属性值。 它与通过派生类型的托管代码类型和成员继承没有直接关系。 有关详细信息,请参阅属性值继承。
报告数据绑定特征(IsNotDataBindable、BindsTwoWayByDefault)。 默认情况下,框架中的依赖属性支持具有单向绑定行为的数据绑定。 如果数据绑定没有适用的方案,则可以禁用数据绑定(因为这些属性应该是灵活且可扩展的,所以在默认的 WPF API 中没有太多此类属性的示例)。 可以针对以下属性将绑定设置为具有双向默认值:将控件在其组件部分中的各种行为绑定在一起的属性(例如 IsSubmenuOpen);或者双向绑定对用户来说是常见且期望的方案的属性(例如 Text)。 更改与数据绑定相关的元数据只会影响默认值;始终可以根据各个绑定更改此默认值。 若要详细了解常规的绑定模式和绑定,请参阅数据绑定概述。
报告支持日记 (Journal) 的应用程序或服务是否应对属性进行日记记录。 对于一般的元素,默认情况下不会启用日记记录功能,但可针对特定用户输入控件有选择性地启用。 此属性旨在由日记的 WPF 实现等日记服务读取,并且通常针对用户控件(例如应在各导航步骤中保留的列表中的用户选择)而设置。 有关日记的信息,请参阅导航概述。
读取 FrameworkPropertyMetadata
以上链接的各个属性都是 FrameworkPropertyMetadata 向其直接基类 UIPropertyMetadata 添加的特定属性。 默认情况下,这些属性都为 false
。 在必须了解这些属性值的情况下,针对某一属性的元数据请求应尝试将返回的元数据强制转换为 FrameworkPropertyMetadata,然后根据需要检查各个属性的值。
指定元数据
如果出于将元数据应用到新依赖属性注册的目的而创建新的元数据实例,则可以选择要使用的元数据类:基 PropertyMetadata 或者某些派生类,例如 FrameworkPropertyMetadata。 通常,应使用 FrameworkPropertyMetadata,尤其是在你的属性与属性系统和 WPF 功能(例如布局和数据绑定)存在任何交互的情况下。 针对更为复杂的方案,还可以从 FrameworkPropertyMetadata 派生以创建自己的元数据报告类,使其成员承载额外的信息。 或者,可以使用 PropertyMetadata 或 UIPropertyMetadata 来传达对实现的功能的支持程度。
对于现有属性(AddOwner 或 OverrideMetadata 调用),应始终使用原始注册所用的元数据类型来替代。
如果正在创建 FrameworkPropertyMetadata 实例,可以通过以下两种方式使用传达框架属性特征的特定属性的值来填充该元数据:
使用允许
flags
参数的 FrameworkPropertyMetadata 构造函数签名。 此参数应使用 FrameworkPropertyMetadataOptions 枚举标志的全部所需合并值来填充。使用无
flags
参数的其中一个签名,然后将 FrameworkPropertyMetadata 上的每个报告布尔属性设置为true
,以获得每个所需的特征更改。 为此,必须在构造具有此依赖属性的任何元素之前对这些属性进行设置;布尔属性是可读写属性,以允许此项避免flags
参数的行为,同时仍然可以填充元数据,但元数据必须在属性使用之前进行有效密封。 因此,尝试在请求元数据之后设置属性是无效操作。
框架属性元数据合并行为
重写框架属性元数据时,会合并或替换不同的元数据特征。
会合并 PropertyChangedCallback。 如果添加一个新的 PropertyChangedCallback,该回叫则存储在元数据中。 如果没有在替代中指定 PropertyChangedCallback,PropertyChangedCallback 的值则会从在元数据中指定它的最近上级提升为一个引用。
PropertyChangedCallback 的实际属性系统行为是:层次结构中所有元数据所有者的实现都保留并添加到表中,属性系统的执行顺序是首先调用最深派生类的回叫。 继承的回叫仅运行一次,当将这些回叫放置在元数据中的类占有时计数。
会替换 DefaultValue。 如果没有在替代中指定 PropertyChangedCallback,DefaultValue 的值则来自在元数据中指定它的最近上级。
会替换 CoerceValueCallback 实现。 如果添加一个新的 CoerceValueCallback,该回叫则存储在元数据中。 如果没有在替代中指定 CoerceValueCallback,CoerceValueCallback 的值则会从在元数据中指定它的最近上级提升为一个引用。
属性系统的行为是仅调用直接元数据中的 CoerceValueCallback。 不保留对层次结构中其他 CoerceValueCallback 实现的引用。
FrameworkPropertyMetadataOptions 枚举的标志组合为按位 OR 运算。 如果指定 FrameworkPropertyMetadataOptions,则不会替代原始选项。 若要更改某个选项,请在 FrameworkPropertyMetadata 上设置相应的属性。 例如,如果原始 FrameworkPropertyMetadata 对象设置 FrameworkPropertyMetadataOptions.NotDataBindable 标志,则可以通过将 FrameworkPropertyMetadata.IsNotDataBindable 设置为
false
来进行更改。
此行为由 Merge 实现,并且可以在派生的元数据类上替代。