在重新定义控件模板时,依赖属性来自何处?

时间:2011-05-04 09:27:03

标签: wpf templates dependency-properties textblock

假设您有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的按钮具有黑色文本。另一个工作正常。为什么?

3 个答案:

答案 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 inheritanceprecedence的问题。

答案 2 :(得分:0)

如果你有一个带有颜色的隐式TextBlock样式,那么除非你明确地进行模板绑定,否则它不会选择Foreground颜色。