2011-05-04 27 views
2

假设你有2个WPF按钮。一个使用TextBlock,而不是另一个。重新定义控制模板时,依赖项属性来自何处?

<Button x:Name="Button1"> 
    <TextBlock>inside textblock</TextBlock> 
</Button> 

<Button x:Name="Button2"> 
    no textblock 
</Button> 

两个按钮使用这个模板, “前景” 依赖属性设置为白色:

<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">    
    <Border Name="Border" TextElement.Foreground="White"> 
    <ContentPresenter/> 
</ControlTemplate> 

按钮与TextBlock的有黑色文本。另一个工作正常。为什么?

回答

2

这是一个价值继承问题,正如H.B.指出。属性值继承通常遵循逻辑树。

在第一种情况:

<Button x:Name="Button1"> 
    <TextBlock>inside textblock</TextBlock> 
</Button> 

TextBlock的的逻辑父是按钮,所以它将继承它从按键值等了逻辑树。因此,在下面的代码,将TextBlock将红:

<Button x:Name="Button1" TextBlock.Foreground="Red"> 
    <TextBlock>inside textblock</TextBlock> 
</Button> 

在第二种情况:

<Button x:Name="Button2"> 
    no textblock 
</Button> 

一个TextBlock最终由ContentPresenter创建(见ILSpy /反射器的方法ContentPresenter.ChooseTemplate )。在这种情况下,TextBlock的逻辑父项是ContentPresenter。所以它会从ContentPresenter等继承它的逻辑树上的值到定义了White前景的Border。

这是简要记录here

+0

非常好,我总是看着相同的视觉树,从来没有想到,逻辑树负责继承。 – 2011-05-04 13:13:45

+1

@ H.B。 - [InheritanceBehavior](http://msdn.microsoft.com/zh-cn/library/system.windows.frameworkelement.inheritancebehavior.aspx)属性会使事情变得更糟,因为它可以使元素上的值继承短路每个元素的基础。 – CodeNaked 2011-05-04 13:21:23

1

如果您有一个TextBlock自带的样式和设置可能会覆盖您在外面设置的附加属性,则无法找到相关参考。

编辑:一般可能是value inheritanceprecedence的问题。

+0

实际上,直接设置内容的按钮可以正常工作。这是使用TextBlock的,它具有意想不到的颜色。 – sthiers 2011-05-04 09:32:50

+0

Oh right,one sec,there was some things in the MSDN documentation ...我认为... – 2011-05-04 09:34:19

+0

找不到它,但是TextBlock的显式创建可能会覆盖AttachedProperties的效果,但不清楚TextBlock是如何隐式创建的... – 2011-05-04 09:52:02

0

如果你有一个含有颜色的隐式TextBlock样式,那么它将不会选择前景色,除非你明确地做了一个模板绑定。

+0

其实,我不想从按钮中获得价值。我想让我的ControlTemplate将其设置为硬编码的白色。显式模板绑定ContentPresenter中的前景将颜色设置为黑色。 – sthiers 2011-05-04 12:32:06

+0

我有点困惑,你为什么要尝试在边框上设置内容颜色。在任何情况下,如果您将ContentPresenter替换为ContentControl,则可以在其上设置Foreground,这可能会解决您的问题。 – dain 2011-05-04 12:35:07

+0

你的意思是在contentPresenter中放置一个边框可能不是一个好习惯吗? (实际上,我只是想了解更好的WPF行为,这样我就不会感到惊讶或困惑,无法获得我认为它是白色的黑色文本。) – sthiers 2011-05-04 13:10:51

相关问题