2010-08-21 3 views
0

J'utilise un ControlTemplate pour définir l'apparence de mes boutons dans une application WPF. De plus, j'aimerais utiliser des styles pour définir certains aspects de mes boutons. Ces styles doivent définir des propriétés sur des éléments définis dans le ControlTemplate, comme (simplifié):Comment modifier les contrôles modélisés en utilisant les styles

<Window.Resources> 
    <ControlTemplate x:Key="Template1" TargetType="Button"> 
     <Grid> 
      <Rectangle Name="rect" Fill="White" Stroke="Blue" StrokeThickness="2"/> 
      <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
     </Grid> 
    </ControlTemplate> 
    <Style x:Key="Style1" TargetType="Button" > 
     <Setter TargetName="rect" Property="Fill" Value="Red"/> 
    </Style> 
</Window.Resources> 

Maintenant, le compilateur se plaint que le TargetName « rect » est pas une cible valide que je peux comprendre depuis un untemplatized Button doesn » t contient un élément nommé "rect".

Je sais que je pourrais changer le style pour définir le modèle complet, mais je voudrais éviter cela (parce que le modèle est beaucoup plus complexe que celui montré ici et je ne veux pas le dupliquer pour chaque style ...

Est-il possible d'obtenir ce comportement? Peut-être en définissant le droit TargetType? D'autres idées?

Répondre

1

Vous pouvez PAS remplacer uniquement une partie du modèle de contrôle. Vous pouvez soit tout changer ou rien.

Vous pouvez cependant avoir des paramètres pour les propriétés du style.

1

Le modèle standard consiste à utiliser TemplateBinding dans le modèle de contrôle pour lier aux propriétés du contrôle lui-même, puis à définir les propriétés du contrôle dans le style. Par exemple:

<Window.Resources> 
    <ControlTemplate x:Key="Template1" TargetType="Button"> 
     <Grid> 
      <Rectangle Name="rect" Fill="{TemplateBinding Background}" Stroke="Blue" StrokeThickness="2"/> 
      <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
     </Grid> 
    </ControlTemplate> 
    <Style x:Key="Style1" TargetType="Button" > 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</Window.Resources> 

Ceci liera la propriété Fill sur rect à la propriété Background du bouton. Le style définira la propriété Background sur Red, ce qui entraînera la définition du remplissage sur Red.

Pour définir les valeurs par défaut, vous devez normalement créer un style qui a donné le modèle ainsi que les autres propriétés:

<Window.Resources> 
    <Style x:Key="BaseStyle" TargetType="Button"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <Grid> 
         <Rectangle Name="rect" Fill="{TemplateBinding Background}" Stroke="Blue" StrokeThickness="2"/> 
         <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Background" Value="White"/> 
    </Style> 
    <Style x:Key="Style1" TargetType="Button" BasedOn="{StaticResource BaseStyle}"> 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</Window.Resources> 

Le premier style appliquera le modèle et arrière-plan défini sur blanc, de sorte que le rectangle sera blanc. Le second style hérite du premier mais place l'arrière-plan en rouge, de sorte que le rectangle sera rouge.

Questions connexes