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