可以显式调用动画反转吗?

本文关键字:动画 调用 | 更新日期: 2023-09-27 17:48:56

WPF中的动画提供布尔参数AutoReverse。是否可以调用AutoReverse = "true"实现的功能?

我的目标是省去一些麻烦的反向动画,尤其是省去大量的代码。动画结束后,不能直接反转


使用AutoReverse和True只显示反向动画的例子,但这不能按要求工作-它仍然显示实际动画和反向动画。

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

可以显式调用动画反转吗?

你可以将时间时钟设置为动画持续时间的100%,这样当动画开始时,它将跳过非反转部分!

编辑:如果持续时间设置为0:0:1.5,则将新时间轴应用于设置为0:0:1.5的动画。自动反转必须设置为开启,然后你只需要开始动画。

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

我发现下面的代码工作得很好:

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

第一次调用toggleAnimate()时,动画将在正常方向上执行,第二次调用toggleAnimate()时,动画将反转