gpt4 book ai didi

wpf - 附加属性在 WPF 中究竟是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 11:09:27 27 4
gpt4 key购买 nike

我对附加属性如何实际将它们的值传达给父元素或子元素感到有些困惑。 TextElement.FontFamily导致子元素继承分配给该属性的值(看似下游的操作,父对子)。 Grid.Column导致父项在特定位置显示该子项(看似上游的操作,子项到父项)。附加属性值如何知道是向上流动还是向下流动?我对此的看法是不正确的,还是缺少一部分可以使所有这些都变得正确?

<StackPanel TextElement.FontFamily="Wingdings">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

<Button Grid.Column="1" Content="My Button"/>
</Grid>
</StackPanel>

最佳答案

这里有两个概念:依赖属性 附加依赖属性 . “附加属性”是依赖属性,因此支持依赖 property value inheritance .
关于基本的依赖属性,一个非常粗略的说法是它们基本上从 wpf(逻辑/视觉)树中的父元素继承它们的值。如果 metadata 依赖属性(附加与否)“向下”继承其值设置为 FrameworkPropertyMetadataOptions . 继承标志,在许多情况下就是这样。
附加属性是可以通过 DependencyObject.SetValue 在任何 wpf 对象(基本上,至少是一个 DependencyObject)上设置的属性。方法。这种机制的目的是将父对象所需的信息“附加”到其他对象,而不是子对象本身。例如,Grid.Row是网格在其渲染区域内放置项目所需的附加属性。
依赖属性由 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,来自反射器:
RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative));

关于wpf - 附加属性在 WPF 中究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1173494/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com