2010-03-21 4 views
7

J'ai un style de bouton:WPF Style: comment changer GradientStop couleur Trigger

<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
     <Grid> 
      <Path x:Name="path1" ... Data="...some data..."> 
      <Path.Fill> 
       <LinearGradientBrush EndPoint="0.5,-0.3" StartPoint="0.5,0.8"> 
       <GradientStop x:Name="gs1" Color="Green" Offset="0.44"/> 
       <GradientStop Color="Black" Offset="0.727"/> 
       </LinearGradientBrush> 
      </Path.Fill> 
      </Path>        
     <ContentPresenter ...properties... /> 
     </Grid> 

    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
     <Setter TargetName="???" Property="Color" Value="Green"></Setter> 
     </Trigger> 
    </ControlTemplate.Triggers> 
    </ControlTemplate> 
</Setter.Value> 

Je veux changer la couleur de GradientStop avec x: Name = "gs1" lorsque la souris est sur le bouton, donc j'utilise Trigger IsMouseOver. Comment puis-je avoir accès à Color Property in Trigger? J'ai essayé TargetName = "gs1" et TargetName = "path1.gs1" mais cela ne fonctionne pas. Une idée?

Répondre

7

Essayez ceci:

<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> 
     <Style.Resources> 
      <LinearGradientBrush x:Key="gs1" EndPoint="0.5,-0.3" StartPoint="0.5,0.8"> 
       <GradientStop Color="Green" Offset="0.44"/> 
       <GradientStop Color="Black" Offset="0.727"/> 
      </LinearGradientBrush> 
      <LinearGradientBrush x:Key="gs2" EndPoint="0.5,-0.3" StartPoint="0.5,0.8"> 
       <GradientStop Color="White" Offset="0.44"/> 
       <GradientStop Color="Black" Offset="0.727"/> 
      </LinearGradientBrush> 
     </Style.Resources> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid> 
         <Path x:Name="path1" ........... Fill="{StaticResource gs1}"> 
         </Path> 
         <ContentPresenter .........../> 
        </Grid> 

        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter TargetName="path1" Property="Fill" Value="{StaticResource gs2}"></Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 

     </Setter> 
    </Style> 

cela fonctionnera pour vous. Vous pouvez également utiliser DataBinding, Déclarer un Color DependencyProperty dans le code, Lier avec la propriété Color de GradientStop et le mettre à jour quand vous le souhaitez.

2

Je pense que vous allez devoir remplacer la brosse entière. Here is a good example de styliser un bouton.

<ControlTemplate.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="Fill" TargetName="path1"> 
     <Setter.Value> 
      <LinearGradientBrush EndPoint="0.5,-0.3" StartPoint="0.5,0.8"> 
       <GradientStop Color="Black" Offset="0.44"/> 
       <GradientStop Color="Green" Offset="0.727"/> 
      </LinearGradientBrush> 
     </Setter.Value> 
     </Setter> 
    </Trigger> 
</ControlTemplate.Triggers> 
+0

Il existe également un moyen d'indexer les GradientStops en XAML mais je ne peux pas obtenir un exemple de travail ... quelque chose comme , comme décrit sur http://books.google.com/books?id=XWu70Oqz6RIC&lpg=PA38&ots=FMR-4o3veZ&dq=pro%20wpf%202008%20with%20c%23%20gradientstops&pg=PA770#v=onepage&q=gradientstops&f=false –

+0

vous peut le faire dans le code, NP, et je suis assez sûr que vous pourriez le faire avec une animation, mais je n'ai jamais vu un indexeur travaillant dans xaml –

+1

Je l'ai utilisé avec succès pour faire