2014-06-10 71 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