2011-04-05 18 views
8

Las animaciones en WPF proporcionan el parámetro booleano AutoReverse. ¿Es posible hacer una llamada a la funcionalidad implementada por AutoReverse = "true"?WPF ¿Se puede invocar explícitamente la animación inversa?

Mi objetivo es evitar algunas molestas animaciones inversas y sobre todo un montón de código. Lo contrario no debe suceder directamente después de que finalizó la animación.


Ejemplo de uso de AutoReverse y Verdadero para animar solamente la animación inversa, pero esto no funciona como se requiere - que todavía anima la animación actual y la animación inversa.

 TranslateTransform transform = new TranslateTransform(0.0, 0.0); 
     myBox.RenderTransform = transform; 

     sb = new Storyboard(); 
     Duration dur = new Duration(TimeSpan.FromSeconds(0.5)); 
     DoubleAnimation shiftAnimation = new DoubleAnimation(100.0, dur); 
     shiftAnimation.AutoReverse = true; 
     sb.Children.Add(shiftAnimation); 
     Storyboard.SetTarget(shiftAnimation, myBox); 
     Storyboard.SetTargetProperty(shiftAnimation, new PropertyPath("RenderTransform.X")); 

     sb.Seek(TimeSpan.FromSeconds(0.5)); 
     sb.Begin(); 
+0

prueba sb.Begin (esto, cierto); y tal vez para pausarlo, y después de eso, ¡para buscarlo y luego repetirlo! algo así como 'sb.Begin (this, true); sb.Pause(); sb.Seek (sb.Duration.TimeSpan); sb.Resume(); ' – Kerwindena

Respuesta

5

podría configurar el reloj temporizador a 100% de la animationduration por lo que cuando se inicia la animación, se saltará la parte no invertida!

Editar: si la duración se establece en 0: 0: 1.5 aplica una nueva línea de tiempo a su conjunto de animación a 0: 0: 1.5. Autoreverse debe estar activado y luego debe comenzar la animación.

Editar 2:

TranslateTransform transform = new TranslateTransform(0.0, 0.0); 
myBox.RenderTransform = transform; 

sb = new Storyboard(); 
Duration dur = new Duration(TimeSpan.FromSeconds(0.5)); 
DoubleAnimation shiftAnimation = new DoubleAnimation(100.0, dur); 
shiftAnimation.AutoReverse = true; 
sb.Children.Add(shiftAnimation); 
Storyboard.SetTarget(shiftAnimation, myBox); 
Storyboard.SetTargetProperty(shiftAnimation, new PropertyPath("RenderTransform.X")); 

sb.Begin(); 
sb.Pause(); 
sb.Seek(sb.Duration.TimeSpan); 
sb.Resume(); 
+0

@Kerwindena: Esto suena increíblemente razonable. Entonces, la ruta de acción sería: ¿Defino mi propia función reverse() que aplica la animación recién definida pero agrega AutoReverse y Timeclock establecidos al 100%? –

+0

@platzhirsch: normalmente esto debería funcionar. pero no puede configurar el reloj horario al 100%, simplemente configure el reloj horario en el mismo valor que la duración de la animación ... ¡Buena suerte! – Kerwindena

+0

@Kerwindena: ¿Cómo se aplica una nueva línea de tiempo? Una animación es una línea de tiempo, pero no puedo encontrar un campo de miembro que declare el reloj de animación. –

1

he encontrado que el siguiente código funciona muy bien:

   private bool reverse=false; 
       TimeSpan animationDuration = TimeSpan.FromMilliseconds(500); 
       Storyboard storyboard1 = new Storyboard();      

       private void prepareStoryBoard(Button btn) 
       { 
       btn.RenderTransform = new CompositeTransform(); 
       DoubleAnimation animationShrink = new DoubleAnimation() { To = 0, 
        Duration =animationDuration , FillBehavior = FillBehavior.HoldEnd }; 
       storyboard1.Children.Add(animationShrink); 
       Storyboard.SetTarget(animationShrink, btn); 
       Storyboard.SetTargetProperty(animationShrink, 
        "(Button.RenderTransform).(CompositeTransform.ScaleX)"); 
       } 

       private void toggleAnimate() 
       { 
        if(reverse==false) 
        { 
         storyboard1.AutoReverse = false; 
         storyboard1.Begin(); 
         reverse=true; 
        } 
        else 
        { 
         storyboard1.AutoReverse = true; 
         storyboard1.Seek(animationDuration); 
         storyboard1.Resume(); 
         reverse = false; 
        } 
       } 

La primera vez toggleAnimate() se llama, la animación se ejecuta en la dirección normal, la La segunda vez que se invoca toggleAnimate() la animación se invierte.

Cuestiones relacionadas