2010-07-08 6 views
0

J'ai créé un bouton. Mes exigences de base sont arrondis plus épais frontière, avec plus d'une couleur (par exemple pour acheter/boutons de vente)Modèle WPF Héritage

J'espérais que je pouvais créer une fois le modèle, et que juste passer outre la brosse frontière comme celui-ci:

<Style x:Key="BorderButton"> 
    <Setter Property="Control.Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
     <Border BorderThickness="2" 
     BorderBrush="Red" 
     CornerRadius="3" 
     Background="{x:Null}"> 
      <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value>    
    </Setter> 
    </Style> 

    <Style x:Key="GreenBorderButton" BasedOn="{StaticResource BorderButton}" TargetType="{x:Type Button}"> 
    <Setter Property="BorderBrush" Value="Green" /> 
    </Style> 

mais ils produisent tous les deux le même style. Ai-je besoin d'écrire le modèle entier à chaque fois? semble être une répétition inutile du code (en particulier si 3 à 4 couleurs sont souhaitées). Espérant qu'il y a un moyen d'hériter d'un modèle.

Répondre

2

Votre code est très proche du fonctionnement; le problème est que GreenBorderButton applique le BorderBrush au bouton lui-même, pas la Bordure dans le Template surchargé. Pour corriger cela, il suffit de modifier BorderBrush de la bordure pour utiliser le BorderBrush du bouton parent. Vous pouvez le faire en utilisant un TemplateBinding comme ceci:

<Style x:Key="BorderButton"> 
    <Setter Property="Control.Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border x:Name="border" 
         BorderThickness="2" 
         BorderBrush="{TemplateBinding Property=BorderBrush}" 
         CornerRadius="3" 
         Background="{x:Null}"> 
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Ensuite, vous pouvez utiliser les mêmes styles redéfinis comme vous avez, ou vous pouvez simplement faire:

<Button Style="{StaticResource BorderButton}" BorderBrush="Blue" Content="Blue" /> 
+0

qui est grand merci. est-il possible d'appliquer TemplateBinding à d'autres propriétés, telles que GradientStop? par exemple, pour créer un modèle de bouton Dégradé, mais manipuler les 2 couleurs qui lui sont appliquées? –