2011-04-05 30 views
8

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

我的目标是腾出一些麻烦的逆向动画,尤其是备用的很多代码。动画结束后不能直接发生逆转。


使用自动翻转和真实的动画只有反向动画的例子,但根据需要,这并不工作 - 它仍然动画的实际动画和反向动画。

 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

尝试sb.Begin(this,true); 也许暂停它,然后寻找它,然后发送! 类似 'sb.Begin(this,true); sb.Pause(); sb.Seek(sb.Duration.TimeSpan); sb.Resume();' – Kerwindena 2011-04-05 15:12:02

回答

5

您可以将时钟设置为animationduration的100%,所以当动画开始时,它会跳过非反转部分!

编辑: 如果持续时间设置为0:0:1.5,则将新的时间轴应用于您的动画设置为0:0:1.5。 Autoreverse必须设置为开启,然后您必须开始动画。

编辑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:听起来很合理。所以动作的路径是:定义我自己的reverse()函数,它应用刚刚定义的动画,但将AutoReverse和Timeclock设置为100%? – 2011-04-05 13:09:11

+0

@platzhirsch:通常这应该工作。但是您不能将时钟设置为100%,只需将时钟设置为与动画持续时间相同的值即可。祝您好运! – Kerwindena 2011-04-05 13:59:49

+0

@Kerwindena:你如何申请一个新的时间表?动画是时间线,但我找不到声明动画时钟的成员字段。 – 2011-04-05 14:01:37

1

我已经发现,下面的代码很好地工作:

   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()时,动画被反转。