假设您有2个WPF按钮。一个使用TextBlock,而不是另一个。
<Button x:Name="Button1">
<TextBlock>inside textblock</TextBlock>
</Button>
和
<Button x:Name="Button2">
no textblock
</Button>
这两个按钮都使用此模板将“Foreground”依赖项属性设置为白色:
<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
<Border Name="Border" TextElement.Foreground="White">
<ContentPresenter/>
</ControlTemplate>
带有TextBlock的按钮具有黑色文本。另一个工作正常。为什么?
答案 0 :(得分:2)
这是一个价值继承问题,如H.B.指出。属性值继承通常遵循逻辑树。
在第一种情况下:
<Button x:Name="Button1">
<TextBlock>inside textblock</TextBlock>
</Button>
TextBlock的逻辑父项是Button,因此它将从Button继承它的值,依此类推逻辑树。因此,在以下代码中,TextBlock将为红色:
<Button x:Name="Button1" TextBlock.Foreground="Red">
<TextBlock>inside textblock</TextBlock>
</Button>
在第二种情况下:
<Button x:Name="Button2">
no textblock
</Button>
TextBlock最终由ContentPresenter创建(请参阅ILSpy / Reflector中的ContentPresenter.ChooseTemplate方法)。在这种情况下,TextBlock的逻辑父级是ContentPresenter。所以它会从ContentPresenter继承它的值,依此类推逻辑树,继承到定义了White前景的Border。
简要记录here。
答案 1 :(得分:1)
如果您的TextBlock具有自己的样式和设置,可能会覆盖您在外部设置的附加属性,则无法找到相关参考。
编辑:一般来说可能是value inheritance和precedence的问题。
答案 2 :(得分:0)
如果你有一个带有颜色的隐式TextBlock样式,那么除非你明确地进行模板绑定,否则它不会选择Foreground颜色。