2016-03-11 2 views
1

enter image description hereEn utilisant la même ControlTemplate dans des styles différents et passer outre une propriété

Pour deux TabItem s J'ai deux Style s, utiliser la même ControlTemplate. Maintenant, je veux styleTabB pour montrer un soulignement jaune au lieu de vert, mais toujours en utilisant le ControlTemplate. Comment puis-je modifier le Style pour accomplir ceci?

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" FontSize="16"> 
    <Window.Resources> 
     <ControlTemplate x:Key="ctrlTemplate" TargetType="{x:Type TabItem}"> 
      <Grid> 
       <TextBlock Name="tbTabItemHeaderText" 
          Text="{TemplateBinding Header}" 
          Grid.Column="0" 
          Background="Thistle" 
          HorizontalAlignment="Left" 
          VerticalAlignment="Center" 
          Margin="3,0,0,3"> 
        <TextBlock.TextDecorations> 
         <TextDecorationCollection> 
          <TextDecoration Location="Underline" 
              PenThicknessUnit="Pixel" 
              PenOffsetUnit="Pixel" 
              PenOffset="2"> 
           <TextDecoration.Pen> 
            <Pen Brush="Green" Thickness="4" /> 
           </TextDecoration.Pen> 
          </TextDecoration> 
         </TextDecorationCollection> 
        </TextBlock.TextDecorations> 
       </TextBlock> 
      </Grid> 
     </ControlTemplate> 
     <!-- Style Tab A --> 
     <Style x:Key="styleTabA" TargetType="{x:Type TabItem}"> 
      <Setter Property="Template" Value="{StaticResource ctrlTemplate}" /> 
     </Style> 
     <!-- Style Tab B --> 
     <Style x:Key="styleTabB" TargetType="{x:Type TabItem}"> 
      <Setter Property="Template" Value="{StaticResource ctrlTemplate}" /> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <TabControl Name="tabControl"> 
      <TabItem Name="tabItem_1" Header="--- Tab A ---" Style="{StaticResource styleTabA}"/> 
      <TabItem Name="tabItem_2" Header="--- Tab B ---" Style="{StaticResource styleTabB}" /> 
     </TabControl> 
    </Grid> 
</Window> 

MISE À JOUR

J'ai essayé la proposition de Chris W., mais pas du tout soulignement apparaît:

<ControlTemplate x:Key="ctrlTemplate" TargetType="{x:Type TabItem}"> 
    ... 
    <TextDecoration.Pen> 
     <Pen Brush="{TemplateBinding Tag}" Thickness="4" /> 
    </TextDecoration.Pen> 
    ... 
</ControlTemplate> 

<!--Style Tab A--> 
<Style x:Key="styleTabA" TargetType="{x:Type TabItem}"> 
    <Setter Property="Tag" Value="Green" /> 
    <Setter Property="Template" Value="{StaticResource ctrlTemplate}" /> 
</Style> 

<!--Style Tab B--> 
<Style x:Key="styleTabB" TargetType="{x:Type TabItem}"> 
    <Setter Property="Tag" Value="Yellow" /> 
    <Setter Property="Template" Value="{StaticResource ctrlTemplate}" /> 
</Style> 

Répondre

1

enter image description here

J'ai fait un peu de changement sur la solution de Chris W. et maintenant il travaille:

<ControlTemplate x:Key="ctrlTemplate" TargetType="{x:Type TabItem}"> 
    ... 
    <TextDecoration.Pen> 
     <!--Changed next line from <Pen Brush="{TemplateBinding Tag}" Thickness="4" /> to:--> 
     <Pen Brush="{Binding Path=Tag, RelativeSource={RelativeSource TemplatedParent}}" Thickness="4" /> 
    </TextDecoration.Pen> 
    ... 
</ControlTemplate> 

<!--Style Tab A--> 
<Style x:Key="styleTabA" TargetType="{x:Type TabItem}"> 
    <Setter Property="Tag" Value="Green" /> 
    <Setter Property="Template" Value="{StaticResource ctrlTemplate}" /> 
</Style> 

<!--Style Tab B--> 
<Style x:Key="styleTabB" TargetType="{x:Type TabItem}"> 
    <Setter Property="Tag" Value="Yellow" /> 
    <Setter Property="Template" Value="{StaticResource ctrlTemplate}" /> 
</Style> 
+1

Ah, tout de suite content que vous ayez votre remède. –

1

Vous pouvez définir le style des enfants au sein de l'enfant par cibler des types particuliers. Ici, tous les stylos sont mis à jour avec la couleur jaune.

<Style x:Key="styleTabB" TargetType="{x:Type TabItem}"> 
    <Style.Resources> 
     <Style TargetType="{x:Type Pen}"> 
      <Setter Property="Brush" Value="Yellow"></Setter> 
     </Style> 
    </Style.Resources> 
    <Setter Property="Template" Value="{StaticResource ctrlTemplate}" /> 
</Style> 
+0

ne fonctionne pas, le message "type Pen doit être une dérivation de FrameworkElement ou FrameworkContentElement" . – Pollitzer

1

@CarbineCoder est correct pour la plupart des cas, mais pour votre exemple, vous avez raison et l'erreur que vous avez reçu de son était prévisible, car Pen est pas un TargetType. Cependant, si nous le modifions juste un peu pour frapper le FrameworkElement réel dont TextDecorations est une propriété essayons ceci ... et lisons le tout puisque le premier extrait est juste un exemple d'explication.

<Style x:Key="styleTabB" TargetType="{x:Type TabItem}"> 
    <Style.Resources> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="TextDecorations"> 
     <Setter.Value> 
      <TextDecorationCollection> 
      <TextDecoration> 
       <TextDecoration.Pen> 
        <Pen Brush="Yellow"/> 
       </TextDecoration.Pen> 
      </TextDecoration> 
      </TextDecorationCollection> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </Style.Resources> 
    <Setter Property="Template" Value="{StaticResource ctrlTemplate}" /> 
</Style> 

** * Sauf qui ne va pas travailler parce que vous espérez pour quelque chose que vous avez déjà fourni une valeur de propriété explicite pour hériter de parent, et il ne fonctionne pas de cette façon. Qu'en est-il à la place nous apportons la propriété pratique Tag (que j'abuse tout le temps) pour rentrer dans notre valeur et permettre un moyen de parler à notre pote à l'intérieur de ce bugger en faisant quelques modifications rapides à votre ControlTemplate comme;

<!-- In your STYLE Template you would want to add a default setter of; 
    <Setter Property="Tag" Value="Green"/> 
--> 

    <ControlTemplate x:Key="ctrlTemplate" TargetType="{x:Type TabItem}"> 
     <Grid Margin="0,0,0,0"> 
     <TextBlock Name="_tbTabItemHeaderText" 
        Text="{TemplateBinding Header}" 
        Grid.Column="0" 
        Background="Thistle" 
        VerticalAlignment="Center" 
        Margin="3,0,0,3"> 
      <TextBlock.TextDecorations> 
      <TextDecorationCollection> 
       <TextDecoration Location="Underline" 
           PenThicknessUnit="Pixel" 
           PenOffsetUnit="Pixel" 
           PenOffset="2"> 
       <TextDecoration.Pen> 
        <Pen Brush="{TemplateBinding Tag}" Thickness="4" /> 
       </TextDecoration.Pen> 
       </TextDecoration> 
      </TextDecorationCollection> 
      </TextBlock.TextDecorations> 
     </TextBlock> 
     </Grid> 
    </ControlTemplate> 

Maintenant nous devrions pouvoir frapper comme; Je n'ai pas eu le temps de tester, mais il semble que cela devrait fonctionner correctement pour votre scénario. J'espère que cela aide.

+0

Avec mon premier essai, je ne peux pas obtenir ce travail, aucun souligné n'est affiché. Je reviendrai demain. – Pollitzer

+0

Le premier extrait est juste pour explication. Vous devrez définir une valeur par défaut sur le modèle de style par opposition au modèle de contrôle. Si j'ai le temps, je vais le tester car c'est une sorte de réflexe de ma part de soumettre quelque chose sans le confirmer d'abord .... mais c'est vendredi. :) –

+0

S'il vous plaît voir ma mise à jour ci-dessus. – Pollitzer