2014-06-10 70 views
2

我有窗口,在這裏我設置一些屬性財產繼承通過的TabControl

<Window Foreground="White" ... 

現在我所有的孩子獲得該財產繼承的,對不對?像這樣

<Window> 
    <Grid> 
     <Label> <-- has Foreground="White" without need to explicitly specify it --> 
     ... 

但是,一旦我使用TabControl,繼承就會中斷。

<Window> 
    <Grid> 
     <TabControl> 
      <TabItem> 
       <Grid> 
        <Label> <-- doesn't inherit Foreground property from Window --> 

我不能設置爲ForegroundTabControl,也許這就是原因。問題是爲什麼以及要做什麼?我可以使用樣式,但是有沒有其他的,更明顯和更少code-ish的方式?

+0

控件不僅繼承屬性DataContext和樣式。你可以用[Snoop](http://snoopwpf.codeplex.com/)來查看它(在你的例子中'Label'的前景實際上是黑色的) –

+0

我的意思是['property property inheritance'](http:// msdn.microsoft.com/en-us/library/ms753197.aspx)。真的很討厭自己先說錯了。 – Sinatr

+0

@TzahMama,這是不正確的。當然,某些控件(如容器控件和基於文本的控件)會繼承屬性值。「DependencyProperty」屬性值繼承將是非常沒有意義的,否則,不是嗎? – Sheridan

回答

2

在這種情況下你可以做的確實不多。物業價值繼承絕對停止在TabControl。我懷疑它與TabItem提供的所有不同的TemplateStyle有關(儘管這實際上不應該引起任何問題)。

如上所述,設置TabControl中多個控件的Foreground屬性的唯一方法是使用Style。但是,一種設置Foreground屬性的方法,該屬性屬於沒有自己的Foreground屬性的控件。這是使用TextElement.Foreground附加屬性:

<Grid TextElement.Foreground="Red"> 
    <StackPanel> 
     <TextBlock Text="Hey what colour am I?" /> 
     <TabControl> 
      <TabItem Header="Header" TextElement.Foreground="Red" /> 
     </TabControl> 
    </StackPanel> 
</Grid> 

當然,TabItem控制Foreground屬性,所以這不是一個很好的例子......它工作更好地在Grid充滿TextBlock小號。您應該注意,雖然設置TextElement.Foreground附加屬性不會對其中沒有TextElement的控件產生任何影響。 (TextBlock控件包含TextElement s)。您也可以致電TextBlock.Foreground

+0

我花了一些時間去經歷。我可以將'TextElement.Foreground'(或者'TextBlock.Foreground',它更像我需要的)設置爲'TabControl',但它對'TabItem'內的'TextBlock'顏色沒有任何作用。它只適用於「TabItem」(並且因爲裏面有多個包含文本的項目 - 這將是相當WET的解決方案)。糟糕的是,所謂的繼承似乎不適用於'Label'或'Button'。並且沒有'Button.Foreground'被連接到父母。 – Sinatr

+0

我不明白你的問題......你說你可以在'Style'中設置'Foreground'屬性,那麼問題在哪裏?我的帖子實際上只是爲了同意你的發現,並且介紹了'TextElement.Foreground'附加屬性......我*在我的回答中說了很多。 – Sheridan

+0

您的回答很有幫助。雖然它似乎沒有以任何方式解決繼承問題的問題:「Window」 - >「TextBlock」鏈中的「TabControl」(正在工作),而是「Window」 - >「TabControl」 - > ... - >'TextBlock'(不)。你的意思是綁定(將'TextElement.Foreground'從父項傳遞給子項,然後進一步)?或者我如何使用附加屬性來通過'TabControl'傳遞'Foreground'值?在你的例子中,你再次爲'TabItem'設置它。那麼爲什麼有更高級別的附加屬性的「網格」? – Sinatr

1

此處繼承無效的原因是dependency property value precedence。 繼承值具有幾乎最低的優先級;它們將被標籤的默認樣式(將黑色值賦予前景色)覆蓋。

在你的第二個代碼片段中,你寫出Grid中的Label有白色前景;這可能是因爲您已將樣式應用於該標籤,或者因爲您的操作系統的默認前景色爲白色。無論如何,這個Label絕對不會從窗口繼承它的白色,如果它是一個沒有樣式的Label控件。

因此,您必須添加樣式到您的Window

<Window.Resources> 
    <Style TargetType="Label"> 
     <Setter Property="Foreground" Value="White"/> 
    </Style> 
</Window.Resources> 
+0

是的,你是絕對正確的,它不適用於標籤。但它適用於'TextBlock'。出於某些原因,當提問時我說'標籤'(我的大腦完全沒有我的控制工作了)。 – Sinatr