2011-09-02 3 views
4

Je sais qu'il doit y avoir une réponse facile à cela mais je ne peux pas le trouver.Base d'un ControlTemplate sur un autre ControlTemplate

J'ai un style de bouton appelé HoverButton.

<Style x:Key="HoverButton" TargetType="Button"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Border> 
        <ContentPresenter/> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="BorderBrush" Value="Black"/> 
         <Setter Property="Background" Value="WhiteSmoke"/> 
         <Setter Property="Foreground" Value="DarkRed"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="Background" Value="Transparent"/> 
</Style> 

Je veux alors créer un autre style « dérivé » qui repose sur un HoverButton avec un contenu spécifique. J'ai réduit la complexité du style ci-dessus, mais c'est assez complexe que je ne veux pas le copier et le coller.

<Style x:Key="CloseButton" BasedOn="{StaticResource HoverButton}" TargetType="{x:Type Button}"> 
    <Setter Property="Content"> 
     <Setter.Value> 
      <Path Width="8" Height="8" Stroke="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=Button}}" Data="M0,0 L8,8 M8,0 L0,8" StrokeThickness="2" /> 
     </Setter.Value> 
    </Setter> 
</Style> 

Cela ne fonctionne pas - "L'élément spécifié est déjà l'enfant logique d'un autre élément. Déconnectez-le d'abord." Il semble que je doive redéfinir la propriété Template du style dérivé, mais référence le style du style de base.

Des idées?

+0

Je vais supposer que le TargetType étant manquant sur le deuxième style était juste un glissement (donc je l'ai ajouté) ... –

Répondre

3

Vous ne pouvez pas baser les modèles les uns sur les autres, mais cette erreur pourrait facilement être résolue. Il suffit de créer un équivalent ContentTemplate au lieu de définir le Content. De cette façon, un Path est créé pour chaque bouton, et non un pour tous les boutons (ce qui n'est pas autorisé).

+0

Voilà. Je savais que ce serait simple. Merci. Maintenant je dois juste travailler * pourquoi * cela fonctionne;) –

+2

@TimRogers: N'ai-je pas expliqué cela suffisamment? Les modèles sont, comme son nom l'indique, des plans de construction de ce qui doit être créé, ils ne sont pas des objets discrets, et tous les éléments de l'interface utilisateur ne peuvent être que l'enfant d'un parent. À l'aide de modèles, chaque bouton crée son propre contenu, mais si vous définissez le contenu dans un style, seul un objet créé est utilisé partout. –

+2

Vous l'avez bien expliqué. Je n'ai pas vraiment apprécié la différence entre les modèles de contrôle et les modèles de contenu, mais je suppose que je le fais maintenant. La propriété 'Template' définit un modèle pour l'ensemble du contrôle, tandis que ContentTemplate définit simplement le modèle utilisé par ContentPresenter. Simple. –