2011-05-04 67 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

相關問題