2010-03-16 12 views
5

Desarrollo una aplicación en WPF usando el patrón MVVM. Estoy mostrando un gráfico orientado, con nodos y enlaces (ver la siguiente imagen).Animación dinámica usando storyboards

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

El usuario puede arrastrar y soltar los nodos de una "célula" a otro. Cuando el usuario suelta un nodo, su posición cambia para alinearlo en la cuadrícula. Lo que quiero hacer es animar el nodo cuando se ajusta su posición durante la rutina de alineación.

Los nodos, enlaces y separadores son todos los elementos que se muestran en un ItemsControl. Su representación se controla con algunas plantillas de datos y su posición con estilos.

Lo que estoy haciendo es el siguiente:

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}"/> 

Lo que quiero hacer es la siguiente:

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> 

Pero esto no funciona en tiempo de ejecución, ya que no puedo obligar a "Para "propiedad de mi DoubleAnimation (es un Freezable).

¿Cuál es la manera más simple de hacer una animación tan dinámica? ¿Animar la propiedad "X" a través de un temporizador directamente en el modelo de vista?

+2

¿Encontró una solución tipo MVVM para esto? Sería genial si pudieras publicar un pequeño fragmento de tu código xaml (más específicamente el tema 'To' vinculante) de tu solución. Gracias – Peanut

Respuesta

1

Resolví un problema similar al animar una propiedad auxiliar (adjunta) de 0 a 1 y luego unir la propiedad deseada del objetivo a la auxiliar con un convertidor de valor. ¿Tiene sentido?

+1

Tiene cierto sentido. Esa es una solución común para algunos problemas bastante similares, ya que este tipo de problema no es muy frecuente en google o stackoverflow :) Pero como gran admirador de MVVM, me decepciona ver que resolví el problema mucho más fácilmente sin el patrón. Demasiada sobrecarga es demasiado. Espero que este comportamiento sea más fácil con futuras revisiones de frameworks, como lo hicieron con InputGesture en un Freezable y no aceptando enlaces de comando. Freezables son geniales, pero no siempre. –

Cuestiones relacionadas