2010-03-16 10 views
5

Sviluppo un'applicazione in WPF utilizzando il pattern MVVM. Sto visualizzando un grafico orientato, con nodi e collegamenti (vedi immagine seguente).Animazione dinamica tramite gli storyboard

http://free0.hiboox.com/images/1110/diapo1c36a4b95802846b8553d2fe9b9e6639.png?26

L'utente può trascinare i nodi da un "cella" ad un altro. Quando l'utente rilascia un nodo, la sua posizione viene modificata per allinearlo nella griglia. Quello che voglio fare è animare il nodo quando la sua posizione viene regolata durante la routine di allineamento.

I nodi, i collegamenti e i separatori sono tutti elementi visualizzati in ItemsControl. La loro rappresentazione è controllata con alcuni DataTemplates e la loro posizione con Styles.

Quello che sto facendo è la seguente:

private void Align() { 
    // Computations... 
    TX = ... //Target X is set 
    TY = ... //target Y is set 
    X = TX; 
    Y = TY; // X and Y setters fire PropertyChanged 
} 

<Style x:Key="NodeViewStyle"> 
    <Setter Property="Canvas.Left" Value="{Binding X, Mode=TwoWay}"/> 
    <Setter Property="Canvas.Top" Value="{Binding Y, Mode=TwoWay}"/> 

Quello che voglio fare è il seguente:

private void Align() { 
    // Computations... 
    TX = ... 
    TY = ... //TX and TY setters fire PropertyChanged 
} 

<Style x:Key="NodeViewStyle"> 
    <Setter Property="Canvas.Left" Value="{Binding X, Mode=TwoWay}"/> 
    <Setter Property="Canvas.Top" Value="{Binding Y, Mode=TwoWay}"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding State}" Value="UPDATEPOS"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation To="{Binding TX}" Duration="0:0:1" 
             Storyboard.TargetProperty="(Canvas.Left)"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 

Ma questo non funziona in fase di esecuzione, dal momento che non può legarsi a "Per "proprietà del mio DoubleAnimation (è un Freezable).

Qual è il modo più semplice per eseguire un'animazione così dinamica? Animare la proprietà "X" attraverso un timer direttamente nel viewmodel?

+2

hai trovato una soluzione simile a MVVM a questo? Sarebbe fantastico se potessi pubblicare un piccolo frammento del tuo codice xaml (più specificamente il problema di associazione "A") della tua soluzione. Grazie – Peanut

risposta

1

Ho risolto un problema simile animando una proprietà ancillare (collegata) da 0 a 1 e quindi legando la proprietà di destinazione desiderata a quella ausiliaria con un convertitore di valori. Ha senso?

+1

Ha davvero un senso. Questa è una soluzione comune per alcuni problemi non simili, poiché questo tipo di problema non è molto frequente su google o stackoverflow :) Ma come un grande fan MVVM, sono deluso nel vedere che ho risolto il problema molto più facilmente senza il modello. Troppo sovraccarico è troppo. Spero che questo comportamento sarà più facile con le future revisioni del framework, come hanno fatto con InputGesture che è un binding di comandi Freezable e che non accetta. I congelamenti sono fantastici, ma non sempre. –

Problemi correlati