开发者

WPF Can the animation reverse be invoked explicitly?

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 a开发者_Go百科nimation 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();


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();


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜