2011-01-18 13 views
8

Ho diversi pulsanti di tipo a levetta che desidero pulsare all'unisono quando nello stato premuto.Sincronizzazione di WPF ColorAnimation su più controlli

Ho definito uno stile con un trigger che avvia l'animazione del bagliore e funziona perfettamente, a parte il fatto che ciascun pulsante pulsa in modo asincrono rispetto agli altri.

Come è possibile che ciascun pulsante sincronizzi il proprio impulso con gli altri?

Ecco lo stile:

<Storyboard x:Key="pulseStory"> 
    <ColorAnimation                  
     Storyboard.TargetProperty="(Control.Background).(SolidColorBrush.Color)" 
        From="Red" 
        To="Transparent" 
        Duration="0:0:1" /> 
</Storyboard> 

<Style x:Key="pulseButton" TargetType="Button"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Tag,RelativeSource={RelativeSource Self}}" Value="True"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard Storyboard="{StaticResource pulseStory}"/> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Cheers!

risposta

4

OK ... io prendere una pugnalata a questo ...

Il quadro WPF non ha alcuna funzione per sincronizzare le animazioni che sono in esecuzione contemporaneamente, in modo che si sta per avere a venire con un metodo diverso. Mi viene in mente una sola idea ...

Animare alcune proprietà Color di un elemento dell'interfaccia utente nascosto all'interno della storyboard, quindi utilizzare il binding UI (cioè i binding ElementName) per connettersi al Colore di ciascun pulsante a questo elemento dell'interfaccia utente nascosto.

+1

Questo è il percorso che ho preso - grandi menti ... :) –

+0

Fantastico: bastano 17 ore e tu puoi rispondere alle tue stesse domande ;-) Cercherò di essere un po 'più veloce la prossima volta! – ColinE

1

In realtà si dovrebbe fare questo tramite una risorsa, almeno l'utilizzo di un controllo nascosto è un po 'troppo un trucco per me personalmente.

ciò che deve essere soddisfatta per farlo funzionare:

  1. La proprietà si associa a deve essere un DependencyProperty, quindi l'oggetto avvolgente deve essere un DependencyObject.
  2. si deve fare riferimento all'oggetto come risorsa statica (al contrario di una risorsa dinamica) in questo modo:
<DoubleAnimation 
    Storyboard.Target="{StaticResource AnimationValue}" 
    Storyboard.TargetProperty="(local:WrappedValue.Value)" 
    To="0" Duration="0:0:1"/> 

Beh, devo ammettere che è un po 'hacky oltre ad avere un wrapper di classe per questo, ma è più pulito di un controllo completo (se si desidera utilizzare i controlli è possibile utilizzare alcune proprietà inutilizzate Tag -property, ad esempio del contenitore che ospita tutti i controlli)

+0

Non ci ho pensato - ci proveremo pure. –

Problemi correlati