这里有两个概念:依赖项属性和附加依赖项属性。 “附加属性”是依赖属性,支持依赖关系property value inheritance。
关于基本依赖属性,一个非常粗略的说法是,它们基本上是从wpf(逻辑/视觉)树中的父元素继承它们的值。如果它的metadata设置为FrameworkPropertyMetadataOptions,则依赖项属性(附加或不附加)将继承其值“向下”。 继承标志,并且在很多情况下都是如此。
附加属性是可以通过DependencyObject.SetValue方法在任何wpf对象上设置的属性(基本上,至少为 DependencyObject)。此机制的目的是“附加”到父对象所需的其他对象信息,而不是子对象本身。例如,Grid.Row是网格所需的附加属性,用于将项目放置在其渲染区域中。
相关属性由wpf对象系统自动“向下”继承。
附加属性在特定对象的代码中显式检查“向上”。在网格的情况下,在确定将物品放置在何处时,它会检查每个包含物品的Grid.Row和Grid.Column附加属性的值。
它也常常是创建自定义附加属性的技术,它以某种方式修改它们所连接的对象(例如,Drag'n'Drop functionality via attached properties)。
作为附加说明,继承附加属性的一个很好的示例是TextElement.FontFamily。 Grid.Row和Grid.Column属性没有设置Inherits标志。
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,从反射器:
RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative));
有趣且信息丰富。但是,这种情况如何:2x2网格(A)包含2x2网格(B)。网格B包含一个按钮。如果网格B具有网格。列附加属性设置为1(因此它出现在其父网格的第二列中,网格A),不应该将附加属性向下级联到网格B的按钮,因此按钮会出现在网格B的第二列? – Pwninstein 2009-07-23 23:01:23