2016-05-23 2 views
2

Я хотел бы повторить мою анимацию несколько раз, каждый раз, когда свойство цели изменилось с завершением или завершением анимации.что не так с моим кодом анимации wpf

Но анимация работает только в первый раз.

Чтобы упростить это, я просто позволю прямоугольнику перемещаться от 0 до 400 на холсте в 10 раз. Выполняется код.

Я искал такие вопросы, как 'wpf repeat animation', который предложил использовать метод seek() или rect.BeginAnimation(property, null), но не работает для меня.

private void init() 
{ 
    Rectangle rect = new Rectangle(); 
    this.RegisterName("rect", rect); 
    rect.Height = 100; 
    rect.Width = 50; 
    rect.Fill = Brushes.LightBlue; 
    Canvas.SetTop(rect, 0); 
    Canvas.SetLeft(rect, 0); 
    myCanvas.Children.Add(rect); 

    TargetAnimation(0); 
} 

private void TargetAnimation(int i) 
{ 
    DoubleAnimation da = new DoubleAnimation(); 
    da.From = 0; 
    da.To = 400; 
    da.Duration = TimeSpan.FromSeconds(5); 

    Storyboard.SetTargetName(da, "rect"); 
    Storyboard.SetTargetProperty(da, new PropertyPath(Canvas.LeftProperty)); 
    Storyboard storyboard = new Storyboard(); 
    storyboard.Children.Add(da); 
    storyboard.Completed += Storyboard_Completed; 
    storyboard.Begin(this); 

} 

private void Storyboard_Completed(object sender, EventArgs e) 
{ 
    if (i < 10) 
     TargetAnimation(++i); 
    else 
     return; 
} 
+0

Почему вы проходящий аргумент 'i' к вашей' методе TargetAnimation'? вы не используете его ... – Pikoh

+0

Почему бы не использовать 'da.RepeatBehavior = RepeatBehavior.Forever;'? –

+0

Прошу прощения за то, что вы не поняли. 'i' является глобальным аргументом. @Pikoh – HDQ

ответ

3

Вы должны зарегистрировать событие завершения первого перед вызовом начать заявление как это:

storyboard.Completed += Storyboard_Completed; 
storyboard.Begin(this); 
0

Вы прошли i в качестве параметра, но вы не использовали его или его значение, чтобы определить. Итак, вы должны ограничить значение TargetAnimation(int i), используя оператор if, который равен целевому значению анимации, которое равно i

2

Я думаю, вы неправильно поняли StoryBoard.Completed. Вы должны применить делегата на da.Completed.

 private void TargetAnimation(int i) 
 
     { 
 
      DoubleAnimation da = new DoubleAnimation(); 
 
      da.From = 0; 
 
      da.To = 400; 
 
      da.Duration = TimeSpan.FromSeconds(5); 
 
      da.Completed += Storyboard_Completed; 
 
      Storyboard.SetTargetName(da, "rect"); 
 
      Storyboard.SetTargetProperty(da, new PropertyPath(Canvas.LeftProperty)); 
 
      Storyboard storyboard = new Storyboard(); 
 
      storyboard.Children.Add(da); 
 
      storyboard.Begin(this); 
 
      //storyboard.Completed += Storyboard_Completed; 
 
     }