2013-03-26 43 views
0

我在代碼背後製作故事板並將其多次鏈接到對方時不成功。不知何故,故事板似乎保持在上下文中,並且不會重置。試圖用不同的方式發射WPF StoryBoard完成動作

我正在動畫幾個元素,X次遞歸地運行動畫方法,但在Completed事件中使用了不同的回調操作。第一個動畫運行正常,但其餘的動畫根本沒有動畫(已完成的事件觸發)。

如果我在一個方法中創建了一個StoryBoard並運行它,它是否應該在它完成後才被處置?我正在努力做storyboard.Remove()

private void SlideLeft(int numberOfStepsToSlide) 
{ 
    if (numberOfStepsToSlide < 1) return; 
    Slide(() => SlideLeft(numberOfStepsToSlide - 1)); 
} 

protected void Slide(Action callBackAfterAnimation = null) 
{ 
    var sb = new Storyboard(); 
    sb.FillBehavior = FillBehavior.Stop; //i thought maybe this would fix it, but no 

    //.. 
    //.. a number of double animations created and added to storyboard 
    //.. 

    sb.Completed += (sender, e) => 
         { 
          sb.Stop(); 
          sb.Remove(); 

          //.. 
          //..sending message to ViewModel and manipulating values 
          //.. 

          if (callBackAfterAnimation != null) 
           callBackAfterAnimation(); 
         }; 
    sb.Begin(); 
} 

謝謝你的時間!

+0

只是稍微改述一下你想要做的事情:你想在動畫中確定N次運行一個Storyboard,並且每次都執行一個不同的Completed處理程序? – JerKimball 2013-03-26 16:46:20

+0

@JerKimball對不起,不清楚!不完全是:我想運行單個故事板N次,其中N是在動畫之前確定的。編輯:我打電話SlideLeft(3),它應該運行故事板三次。 – cederlof 2013-03-27 08:05:07

回答

1

對不起,完全忘了這個問題!

你不想叫Remove - 基本上殺死動畫死了,全部遇難創建運行動畫時鐘...嘗試這樣的事情,而不是(快速和骯髒的例子):

var win = new Window(); 
win.Width = 50; 
win.Height = 50; 

int runCount = 3; 
int halfSteps = runCount * 2; 
double toWidth = 500.0; 

var sb = new Storyboard(); 
var biggerator = new DoubleAnimation(toWidth, new Duration(TimeSpan.FromSeconds(2))); 
sb.Children.Add(biggerator); 
Storyboard.SetTarget(biggerator, win); 
Storyboard.SetTargetProperty(biggerator, new PropertyPath("Width")); 

sb.Completed += (o,e) => 
{ 
    sb.Stop();   
    halfSteps--; 
    if(halfSteps <= 0) 
    { 
     win.Height = 150; 
    } 
    else 
    { 
     biggerator.To = biggerator.To == 0 ? toWidth : 0; 
     sb.Begin(); 
    } 
}; 

sb.Begin();  
win.Show();