2010-06-07 8 views
5

Je voudrais faire quelque chose qui semble assez simple, mais je n'arrive pas à comprendre comment le faire. J'ai un ColorAnimation qui est déclenché lorsque l'événement MouseEnter se produit. Il modifie simplement la couleur d'arrière-plan d'une bordure d'une couleur à une autre couleur.Comment lier à une couleur dans un ColorAnimation WPF?

Malheureusement, je n'arrive pas à comprendre comment mettre autre chose que des couleurs codées en dur dans ce ColorAnimation. Il semble donc actuellement comme ceci:

<Style x:Key="MouseOverStyle"> 
<Style.Triggers> 
    <EventTrigger RoutedEvent="Mouse.MouseEnter"> 
     <EventTrigger.Actions> 
      <BeginStoryboard> 
       <Storyboard> 
        <ColorAnimation Duration="0:0:0.5" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
            To="Red" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger.Actions> 
    </EventTrigger> 
</Style.Triggers> 
</Style> 

Cependant, je voudrais faire quelque chose soit comme ceci:

<SolidColorBrush x:Key="MyEventColor" Color="{Binding EventColor}" /> 

<Style x:Key="MouseOverStyle"> 
<Style.Triggers> 
    <EventTrigger RoutedEvent="Mouse.MouseEnter"> 
     <EventTrigger.Actions> 
      <BeginStoryboard> 
       <Storyboard> 
        <ColorAnimation Duration="0:0:0.5" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
            To="{StaticResource MyEventColor}" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger.Actions> 
    </EventTrigger> 
</Style.Triggers> 
</Style> 

Ou comme ceci:

<Style x:Key="MouseOverStyle"> 
<Style.Triggers> 
    <EventTrigger RoutedEvent="Mouse.MouseEnter"> 
     <EventTrigger.Actions> 
      <BeginStoryboard> 
       <Storyboard> 
        <ColorAnimation Duration="0:0:0.5" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
            To="{Binding EventColor}" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger.Actions> 
    </EventTrigger> 
</Style.Triggers> 
</Style> 

Lorsque je tente de faire, soit de ceux-là, une exception est levée. Pour le premier, il jette une exception me disant essentiellement que la propriété "Color" ne peut pas prendre une valeur SolidColorBrush ... ce qui est logique ... mais ça ne m'aide certainement pas car ColorAnimation ne me laisse pas anime la propriété "(Border.Background). (SolidColorBrush)" ... elle me permettra seulement d'animer la propriété "(Border.Background). (SolidColorBrush.Color)" ....

L'exception sur la Le deuxième exemple me dit essentiellement qu'il "ne peut pas geler cette arborescence de storyboard Storyboard pour une utilisation à travers les threads" ... donc il semble que ColorAnimation essaie de faire cette liaison dans un autre thread que le thread UI ou quelque chose? Quoi qu'il essaie de faire ... ça ne marche pas.

Comment diable puis-je faire une tâche aussi simple?

Répondre

7

Pour la première, vous pouvez utiliser {StaticResource MyColor} avec MyColor défini comme tel:

<Color x:Key="MyColor">#FF00FF00</Color> 

Cependant, cela ne résout pas votre problème: vous ne pouvez pas lier aux propriétés d'animation puisque ces propriétés doivent être gelé (immuable) pour que l'animation fonctionne. Essayez d'enlever votre dépendance à une liaison, ou recréer le storyboard avec la couleur correcte du code derrière lorsque la couleur change.

+0

Malheureusement, la première solution ne fonctionnerait que s'il y avait un moyen de lier un Color à un dans le code derrière. Je peux me débarrasser en toute sécurité de la liaison pour l'animation de l'événement "MouseEnter" ... ce qui signifie que pour chaque instance de ce contrôle, si la souris survole dessus, le contrôle tournera vers la même couleur. Je ne peux cependant pas me débarrasser en toute sécurité de la liaison pour l'animation de l'événement "MouseLeave" correspondante (qui ressemble exactement) car chaque instance de cet objet pourrait avoir une propriété BackgroundColor différente, et quand la souris quitte cette couleur doit revenir à Ordinaire. – David

+0

Pour l'animation MouseLeave, vous pouvez utiliser exactement la même méthode pour obtenir l'effet inverse en changeant "To" à "From". Cela vous permet de spécifier la couleur à démarrer et utilisera la couleur d'origine à la place de "À". Une autre chose à surveiller est que si un pinceau de dégradé est appliqué en arrière-plan, ces animations cesseront de fonctionner. –

Questions connexes