2009-07-02 86 views
3

我期待有一个TabItem的文本的前景每当选项卡变为活动时更改。我用的是下面的,这是工作的罚款,直到我改变了显示在该选项卡的内容的类型:如何使用嵌套文本更改WPF TabItem的文本前景?

<TabControl Style="{DynamicResource SidebarTabControl}"> 
    <TabItem Header="TabItem" Style="{DynamicResource SidebarTab}" /> 
</TabControl> 

<Style x:Key="SidebarTabForegroundStyleSelected"> 
    <Setter Property="TextBlock.Foreground" Value="White" /> 
</Style> 

<Style x:Key="SidebarTabForegroundStyle"> 
    <Setter Property="TextBlock.Foreground" Value="Black" /> 
</Style> 

<Style x:Key="SidebarTab" TargetType="TabItem"> 
    <Setter Property="Padding" Value="10,12,2,12" /> 
    <Setter Property="BorderThickness" Value="0,1,0,1" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <Border Padding="{TemplateBinding Padding}" 
        Name="tab" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        BorderBrush="{StaticResource SidebarTabBorderBrush}" 
        SnapsToDevicePixels="True"> 
        <ContentPresenter Style="{StaticResource SidebarTabForegroundStyle}" Name="content" ContentSource="Header" /> 
       </Border> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrushSelected}" /> 
         <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrushSelected}" /> 
         <Setter TargetName="content" Property="Style" Value="{StaticResource SidebarTabForegroundStyleSelected}" /> 
        </Trigger> 
        <Trigger Property="IsSelected" Value="False"> 
         <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrush}" /> 
         <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrush}" /> 
         <Setter TargetName="content" Property="Style" Value="{StaticResource SidebarTabForegroundStyle}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 

      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

当我改变了的TabItem到:

<TabControl Style="{DynamicResource SidebarTabControl}"> 
    <TabItem Style="{DynamicResource SidebarTab}"> 
     <TabItem.Header> 
      <StackPanel Orientation="Horizontal"> 
       <Image Height="16" Source="..\..\Icons\cog.png" /> 
       <TextBlock Text="TabItem" Margin="5,0,0,0" VerticalAlignment="Center" /> 
      </StackPanel> 
     </TabItem.Header> 
    </TabItem> 
</TabControl> 

文本的前景不选择标签时会变为白色,而不再选择标签时会变回黑色。其他一切仍然正常工作。

有谁知道是否有办法在上面的XAML中完成改变前景的颜色?

+0

在ContentPresenter删除你的风格,它的首要触发条件:http://msdn.microsoft.com/en-us/ library/ms743230.aspx – rmoore 2009-07-02 20:54:23

+0

谢谢,您的问题帮助回答了我即将问到的类似问题。 – IbrarMumtaz 2012-06-12 08:49:23

回答

4

从控制模板移动触发的风格:

<Grid> 
    <Grid.Resources> 
     <SolidColorBrush x:Key="SidebarTabBackgroundBrushSelected" Color="Gray"></SolidColorBrush> 
     <SolidColorBrush x:Key="SidebarTabBorderBrushSelected" Color="Blue"></SolidColorBrush> 
     <SolidColorBrush x:Key="SidebarTabBackgroundBrush" Color="LightGray"></SolidColorBrush> 
     <SolidColorBrush x:Key="SidebarTabBorderBrush" Color="Green"></SolidColorBrush> 

     <Style x:Key="SidebarTab" TargetType="TabItem"> 
      <Setter Property="Padding" Value="10,12,2,12" /> 
      <Setter Property="BorderThickness" Value="0,1,0,1" /> 
      <Setter Property="Foreground" Value="Blue"></Setter> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TabItem}"> 
         <Border Padding="{TemplateBinding Padding}" 
       Name="tab" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       BorderBrush="{StaticResource SidebarTabBorderBrush}" 
       SnapsToDevicePixels="True"> 
          <ContentPresenter Name="content" 
               ContentSource="Header" /> 
         </Border> 

         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
           <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrushSelected}" /> 
           <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrushSelected}" /> 
          </Trigger> 
          <Trigger Property="IsSelected" Value="False"> 
           <Setter TargetName="tab" Property="Background" Value="{StaticResource SidebarTabBackgroundBrush}" /> 
           <Setter TargetName="tab" Property="BorderBrush" Value="{StaticResource SidebarTabBorderBrush}" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 

        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Foreground" Value="Red"></Setter> 
       </Trigger> 
       </Style.Triggers> 
     </Style> 
    </Grid.Resources> 
    <TabControl Style="{DynamicResource SidebarTabControl}"> 
     <TabItem Header="TabItem 1" Style="{DynamicResource SidebarTab}" /> 
     <TabItem Style="{DynamicResource SidebarTab}" > 
      <TabItem.Header> 
       <StackPanel> 
        <TextBlock Text="a"></TextBlock> 
        <TextBlock Text="b"></TextBlock> 
       </StackPanel> 
      </TabItem.Header> 
     </TabItem> 
     <TabItem Header="TabItem 3" Style="{DynamicResource SidebarTab}" /> 
    </TabControl> 
</Grid> 
0

它看起来像问题来了,因为你设置了错误的属性:

<Style x:Key="SidebarTabForegroundStyleSelected"> 
    <Setter Property="TextBox.Foreground" Value="White" /> 
</Style> 

<Style x:Key="SidebarTabForegroundStyle"> 
    <Setter Property="TextBox.Foreground" Value="Black" /> 
</Style> 

您必须设置TextElement.Foreground或TextBlock.Foreground

而且,由于它是一个继承的属性,你可以直接在TabItems上设置AttachedProperty,你不需要专门为它指定内容。

<TabControl Style="{DynamicResource SidebarTabControl}"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="{x:Type TabItem}"> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" 
         Value="True"> 
        <Setter Property="TextElement.Foreground" 
          Value="Red" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TabControl.ItemContainerStyle> 
    <TabItem> 
     <TabItem.Header> 
      <StackPanel Orientation="Horizontal"> 
       <Image Height="16" 
         Source="..\..\Icons\cog.png" /> 
       <TextBlock Text="TabItem" 
          Margin="5,0,0,0" 
          VerticalAlignment="Center" /> 
      </StackPanel> 
     </TabItem.Header> 
     Item 1 
    </TabItem> 
    <TabItem> 
     <TabItem.Header> 
      <TextBlock Text="Tab 2" /> 
     </TabItem.Header> 
     Item 2 
    </TabItem> 
    <TabItem Header="Item 3"> 
     Item 3 
    </TabItem> 
</TabControl> 
+0

哎呦,我的错字。那应该是TextBlock.Foreground。我尝试了你的建议,并没有得到StackPanel文本的预期结果,在活动时应该变成白色(或者在你的例子中是红色的)。 – 2009-07-02 20:09:39

相关问题