2009-08-07 3 views
0

J'ai un ControlTemplate qui utilise la même couleur dans plusieurs éléments. Sur certains déclencheurs (par exemple OnMouseOver), j'aimerais changer cette couleur. Autant que je puisse voir, je dois définir un setter pour que chaque élément change de couleur. Existe-t-il un moyen de référencer une ressource partagée dans le modèle auquel tous les éléments contenus peuvent accéder, et qui peut être modifiée par un déclencheur, de sorte que je n'ai pas à traiter chaque élément?Modifier la couleur commune dans ControlTemplate

Voici un (composé) exemple:

<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}"> 
    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <Ellipse Fill="red" Grid.Column="0"/> 
    <Ellipse Fill="red" Grid.Column="1"/> 
    <ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/> 
</Grid> 
</ControlTemplate> 

Lorsque le contrôle est désactivé, je veux que les ellipses soient gris, sans mettre les deux explicitement, par exemple Je ne suis pas veux écrire

<Trigger Property="IsEnabled" Value="False"> 
    <Setter TargetName="_ellipse1" Property="Fill" Value="Grey"/> 
    <Setter TargetName="_ellipse2" Property="Fill" Value="Grey"/> 
</Trigger> 

mais définir la couleur des deux ellipses avec juste un poseur .

Répondre

2

Placez le déclencheur sur un style pour les ellipses (ellipsi?) À la place du bouton. IsEnabled se propage vers le bas si vous définissez IsEnabled = false sur le bouton.

<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}"> 
    <ControlTemplate.Resources> 
     <Style TargetType="{x:Type Ellipse}"> 
      <Setter Property="Fill" Value="Red" /> 
      <Style.Triggers> 
       <Trigger Property="IsEnabled" Value="False"> 
        <Setter Property="Fill" Value="Gray" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ControlTemplate.Resources> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Ellipse Grid.Column="0"/> 
     <Ellipse Grid.Column="1"/> 
     <ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/> 
    </Grid> 
</ControlTemplate> 
+0

Cela a fait l'affaire de la manière la plus simple, merci. (bien que je devais comprendre que vous ne devez pas définir la couleur dans ControlTemplate, mais dans le style exclusivement.) –

+0

Merci - exactement la syntaxe dont j'avais besoin aussi –

1

Je pense que la meilleure façon de le faire est avec un convertisseur de valeur. Ensuite, vous pouvez éviter complètement un déclencheur désordonné. Voici votre exemple, mais avec un convertisseur ajouté.

<Window.Resources> 
    <local:EnabledToColorConverter x:Key="enabledToColorConverter"/> 
    <ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Ellipse Name="_ellipse1" Fill="{TemplateBinding IsEnabled, Converter={StaticResource enabledToColorConverter}}" Grid.Column="0"/> 
     <Ellipse Name="_ellipse2" Fill="{TemplateBinding IsEnabled, Converter={StaticResource enabledToColorConverter}}" Grid.Column="1"/> 
     <ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/> 
    </Grid> 
    </ControlTemplate> 
</Window.Resources> 

<StackPanel> 
    <Button Template="{StaticResource myTemplate}">Enabled Button</Button> 
    <Button Template="{StaticResource myTemplate}" IsEnabled="False">Disabled Button</Button> 
</StackPanel> 

Et voici le convertisseur:

public class EnabledToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool isEnabled = (bool)value; 
     return isEnabled ? 
      Brushes.Red : 
      Brushes.Gray; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Il est une solution assez laid, car les couleurs sont codées en dur dans le convertisseur de valeur (malheureusement, IValueConverter.Convert prend un seul paramètre), mais qui pourrait faire l'affaire. Je vais essayer ça. –

+0

Non, vous pouvez utiliser ConverterParameter sur la liaison et passer des couleurs différentes. Ou vous pouvez définir les couleurs de manière statique et y accéder de cette façon. – Charlie

Questions connexes