2010-06-07 10 views
5

Mi piacerebbe fare qualcosa che sia apparentemente abbastanza semplice, ma non riesco a capire come farlo. Ho un ColorAnimation che viene attivato quando si verifica l'evento MouseEnter. Cambia semplicemente il colore di sfondo di un bordo da un colore a un altro colore.Come si associa a un colore in un ColorAnimation WPF?

Purtroppo, non riesco a capire come mettere tutto tranne i colori hardcoded in questo ColorAnimation. Così sembra attualmente così:

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

Tuttavia, mi piacerebbe fare qualcosa di simile sia:

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

O come questa:

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

Quando provo a che vedere né di quelli, viene generata un'eccezione. Per la prima, genera un'eccezione che mi dice essenzialmente che la proprietà "Color" non può prendere un valore di SolidColorBrush ... il che ha senso ... ma certamente non mi aiuta perché ColorAnimation non mi permette animare la proprietà "(Border.Background). (SolidColorBrush)" mi permetterà solo di animare la proprietà "(Border.Background). (SolidColorBrush.Color)" ....

L'eccezione sul il secondo esempio in pratica mi dice che "Non è possibile congelare questo albero della timeline di Storyboard per l'uso tra i thread" ... quindi sembra che ColorAnimation stia cercando di eseguire questa associazione in qualche altro thread rispetto al thread dell'interfaccia utente o qualcosa del genere? Qualunque cosa stia cercando di fare ... non sta funzionando.

Come diavolo posso fare un compito così semplice?

risposta

7

Per il primo, è possibile utilizzare {StaticResource MyColor} con MyColor definiti come tali:

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

Tuttavia, questo non risolve il problema: non è possibile associare alle proprietà di animazione in quanto tali proprietà devono essere congelato (non modificabile) affinché l'animazione funzioni. Provare a rimuovere la dipendenza da un'associazione o ricreare lo storyboard con il colore corretto del codice sottostante quando il colore cambia.

+0

Sfortunatamente la prima soluzione funzionava solo se c'era un modo per associare un colore a uno nel codice sottostante. Posso tranquillamente sbarazzarmi del binding per l'animazione dell'evento "MouseEnter" ... il che significa che per ogni istanza di questo controllo, se il mouse vi passa sopra, il controllo si trasformerà nello stesso colore. Tuttavia, non posso sbarazzarmi del binding per l'animazione dell'animazione "MouseLeave" corrispondente (che sembra esattamente la stessa) poiché ogni istanza di questo oggetto può avere una diversa proprietà BackgroundColor e quando il mouse lascia il colore deve tornare a normale. – David

+0

Per l'animazione MouseLeave è possibile utilizzare lo stesso identico metodo per ottenere l'effetto inverso cambiando "A" su "Da". Ciò consente di specificare il colore da avviare e utilizzerà il colore originale al posto di "A". Un'altra cosa a cui prestare attenzione è che se un pennello sfumato viene applicato come sfondo, queste animazioni smetteranno di funzionare. –