2009-07-02 6 views
3

Je cherche à faire en sorte que le premier plan du texte d'un TabItem change chaque fois que l'onglet devient actif. J'utilisais ce qui suit, qui fonctionnait très bien jusqu'à ce que je changé le type de contenu affiché dans l'onglet:Comment modifier le texte au premier plan d'un onglet WPF avec du texte imbriqué?

<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> 

Quand je changé le 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> 

Le premier plan du texte ne devient plus blanc lorsque l'onglet est sélectionné et revient au noir lorsque l'onglet n'est plus sélectionné. Tout le reste fonctionne toujours correctement.

Est-ce que quelqu'un sait s'il existe un moyen de changer la couleur du premier plan dans le XAML ci-dessus?

+0

Retirez votre style sur le ContentPresenter, il est primordial vos déclencheurs: http://msdn.microsoft.com/en-us/ library/ms743230.aspx – rmoore

+0

Merci, votre question a aidé à répondre à une question similaire que j'étais sur le point de poser. – IbrarMumtaz

Répondre

4

Déplacer le déclencheur à partir du modèle de commande du style:

<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

Merci pour l'aide. –

0

Il semble que la question est à venir parce que vous définissez la mauvaise propriété:

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

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

Vous devez être mise TextElement.Foreground ou TextBlock.Foreground

En outre, depuis C'est une propriété héritée, vous pouvez simplement définir AttachedProperty directement sur les TabItems, vous n'avez pas besoin de l'assigner spécifiquement au contenu.

<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

Oups, faute de frappe de ma part. Cela aurait dû être TextBlock.Foreground. J'ai essayé ce que vous avez suggéré, et n'ai pas obtenu les résultats souhaités avec le texte StackPanel, qui devrait devenir blanc lorsqu'il est actif (ou rouge dans votre exemple). –

+1

Si vous essayez de le mettre à jour dans votre modèle de contrôle assurez-vous de vous débarrasser du style sur: le présentateur de contenu a une priorité plus élevée que les déclencheurs du modèle de contrôle: http://msdn.microsoft.com/en-us/library/ms743230.aspx – rmoore

Questions connexes