2010-06-07 5 views
5

Ich möchte etwas tun, das scheinbar ziemlich einfach ist, aber ich kann nicht herausfinden, wie es geht. Ich habe eine ColorAnimation, die ausgelöst wird, wenn das MouseEnter-Ereignis auftritt. Es ändert einfach die Hintergrundfarbe eines Randes von einer Farbe zu einer anderen Farbe.Wie binde ich an eine Farbe in einer WPF ColorAnimation?

Leider kann ich nicht herausfinden, wie man etwas anderes als hardcoded Farben in diese ColorAnimation steckt. So sieht es derzeit wie folgt aus:

<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> 

Allerdings würde ich etwas tun entweder wie folgt aus:

<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> 

Oder wie folgt aus:

<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> 

Wenn ich versuche, entweder zu tun davon wird eine Ausnahme ausgelöst. Zum einen gibt es eine Exception, die mir im Wesentlichen sagt, dass die "Color" -Eigenschaft keinen SolidColorBrush-Wert annehmen kann ... was Sinn macht ... aber es hilft mir nicht, weil die ColorAnimation mich nicht lässt animiere die "(Border.Background). (SolidColorBrush)" Eigenschaft ... es lässt mich nur die Eigenschaft "(Border.Background). (SolidColorBrush.Color)" animieren ....

Die Ausnahme auf der Das zweite Beispiel sagt mir im Grunde, dass es "diesen Storyboard-Timeline-Tree für die Verwendung über Threads nicht einfrieren kann" ... also klingt es, als ob die ColorAnimation versucht, diese Bindung in einem anderen Thread als dem UI-Thread oder etwas zu tun? Was auch immer es zu tun versucht ... es funktioniert nicht.

Wie zum Teufel kann ich so eine einfache Aufgabe tun?

Antwort

7

Für die erste, könnten Sie {StaticResource MyColor} mit MyColor als solche definiert verwenden:

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

jedoch das Ihr Problem nicht lösen: Sie nicht auf Animationseigenschaften binden können, da diese Eigenschaften sein müssen eingefroren (unveränderbar), damit die Animation funktioniert. Versuchen Sie entweder, die Abhängigkeit von einer Bindung zu entfernen, oder erstellen Sie das Storyboard mit der richtigen Farbe aus dem Code, der sich hinter der Farbe befindet, wenn sich die Farbe ändert.

+0

Leider würde die erste Lösung nur funktionieren, wenn es eine Möglichkeit gäbe, eine Farbe an eine im Code dahinter zu binden. Ich kann die Bindung für die Animation des "MouseEnter" -Ereignisses sicher loswerden ... was bedeutet, dass für jede Instanz dieses Steuerelements, wenn die Maus darüber bewegt wird, das Steuerelement die gleiche Farbe annimmt. Ich kann jedoch nicht die Bindung für die entsprechende Animation des "MouseLeave" -Ereignisses sicher entfernen (die genau gleich aussieht), da jede Instanz dieses Objekts eine andere BackgroundColor-Eigenschaft haben kann, und wenn die Maus die Farbe verlässt, muss sie zurückkehren normal. – David

+0

Für die MouseLeave-Animation können Sie genau die gleiche Methode verwenden, um den umgekehrten Effekt zu erzielen, indem Sie "To" zu "From" ändern. Damit können Sie die zu startende Farbe angeben und die Originalfarbe anstelle von "An" verwenden. Eine andere Sache, auf die Sie achten sollten, ist, dass wenn ein Farbverlaufsbürste als Hintergrund angewendet wird, diese Animationen nicht mehr funktionieren. –