Mar*_*ter 23 wpf xaml attached-properties
关于Attached Properties如何将其值传递给父元素或子元素,我有点神秘.TextElement.FontFamily导致子元素继承分配给该属性的值(看似下游的操作,父级到子级).Grid.Column导致父项在特定位置显示该子项(看似上游操作,子项与父项).Attached Property值如何知道要么向上还是向下流动?我的这个概念是不正确的,还是有一个缺失会让所有这些都被置于透视中?
<StackPanel TextElement.FontFamily="Wingdings">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="1" Content="My Button"/>
</Grid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
Ken*_* K. 42
这里有两个概念:依赖属性和附加依赖属性."附加属性"是依赖属性,因此支持依赖属性值继承.
关于基本依赖属性,一个非常粗略的陈述是它们基本上从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));
Run Code Online (Sandbox Code Playgroud)
Grid.Row,来自Reflector:
RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative));
Run Code Online (Sandbox Code Playgroud)