这里有两个概念:依赖属性和附加依赖属性。 “附加属性”是依赖属性,因此支持依赖property value inheritance。
关于基本的依赖属性,一个非常粗略的说法是它们基本上从 wpf(逻辑/视觉)树中的父元素继承其值。如果使用 FrameworkPropertyMetadataOptions 设置了依赖项属性(是否附加),则它的值“向下”继承。Inherit 标志,在许多情况下都是如此。
附加属性是可以通过DependencyObject.SetValue 方法在任何 wpf 对象(基本上,至少一个 DependencyObject)上设置的属性。这种机制的目的是“附加”到父对象所需的其他对象信息,而不是子对象本身。例如,Grid.Row 是 Grid 将项目放置在其渲染区域内所需的附加属性。
wpf 对象系统自动“向下”继承依赖属性。
在特定对象的代码中明确地“向上”检查附加属性。在 Grid 的情况下,在确定放置其项目的位置后,它会检查每个包含项目的 Grid.Row 和 Grid.Column 附加属性的值。
创建自定义附加属性通常也是一种技术,这些属性以某种方式修改它们附加到的对象(例如,Drag'n'Drop functionality via attached properties)。
作为附加说明,继承附加属性的一个很好的例子是TextElement.FontFamily。 Grid.Row 和 Grid.Column 属性没有设置 Inherits 标志。
TextElement.FontFamily,来自 Reflector:
FontFamilyProperty = DependencyProperty.RegisterAttached("FontFamily", typeof(FontFamily), typeof(TextElement), new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(TextElement.IsValidFontFamily));
Grid.Row,来自 Reflector:
RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative));