Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF Can the animation reverse be invoked explicitly?

Tags:

c#

.net

wpf

Animations in WPF provide the boolean parameter AutoReverse. Is it possible to make a call to the functionality implemented by AutoReverse = "true"?

My goal is to spare some troublesome reverse animation and especially spare alot of code. The reverse must not happen directly after the animation ended.


Example of using AutoReverse and True to animate only the reverse animation, but this does not work as required - it still animates the actual animation and the reverse animation.

        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();
like image 634
Konrad Reiche Avatar asked Apr 05 '11 12:04

Konrad Reiche


2 Answers

you could set the timeclock to 100% of the animationduration so when the animation starts, it will skip the non-reversed part!

Edit: if Duration is set to 0:0:1.5 you apply a new timeline to your animation set to 0:0:1.5. Autoreverse has to be set to on and then you yust have to start the animation.

Edit 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();
like image 192
Legy Avatar answered Sep 22 '22 15:09

Legy


I have found that the following code works nicely:

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

The first time toggleAnimate() is called, the animation is executed in the normal direction, the second time toggleAnimate() is invoked the animation is reversed.

like image 30
Pierre Poliakoff Avatar answered Sep 23 '22 15:09

Pierre Poliakoff