这里有两个概念:依赖属性和附加依赖属性。“附加属性”是依赖属性,因此支持依赖属性值继承。
关于基本依赖属性,一个非常粗略的说法是它们基本上从 wpf(逻辑/视觉)树中的父元素继承其值。如果使用FrameworkPropertyMetadataOptions设置其元数据,则依赖属性(附加或不附加)会“向下”继承其值。继承标志,在很多情况下都是如此。
附加属性是可以通过DependencyObject.SetValue方法在任何 wpf 对象(基本上,至少是一个 DependencyObject)上设置的属性。这种机制的目的是“附加”到父对象所需的其他对象信息,而不是子对象本身。例如,Grid.Row是 Grid 将项目放置在其呈现区域内所需的附加属性。
wpf 对象系统自动“向下”继承依赖属性。
附加属性在特定对象的代码中被明确地“向上”检查。对于 Grid,在确定其项目的放置位置后,它会检查每个包含项目的 Grid.Row 和 Grid.Column 附加属性的值。
它通常也是创建自定义附加属性的技术,这些属性以某种方式修改它们附加到的对象(例如,通过附加属性的 Drag'n'Drop 功能)。
作为附加说明,继承附加属性的一个很好的例子是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));