2016-05-23 3 views
2

Ich möchte meine Animation mehrmals wiederholen, jedes Mal, wenn die Eigenschaft eines Ziels mit ausgelöst oder Animation beendet würde.Was ist los mit meinem wpf Animationscode

Aber die Animation funktioniert nur zum ersten Mal.

Um das zu vereinfachen, lasse ich einfach ein Rechteck in einem Canvas 10 Mal von 0 auf 400 bewegen. Der Code wird befolgt.

Ich habe Fragen wie 'wpf Wiederholungsanimation', die seek() Methode oder rect.BeginAnimation(property, null) vorgeschlagen vorgeschlagen, aber funktioniert nicht für mich.

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

Warum Sie übergeben ein Argument 'I' zu 'TargetAnimation' Methode? Sie verwenden es nicht ... – Pikoh

+0

Warum verwenden Sie nicht das 'da.RepeatBehavior = RepeatBehavior.Forever;'? –

+0

Es tut mir leid, dass ich es nicht klar gemacht habe. "Ich" ist ein globales Argument. @ Pikoh – HDQ

Antwort

3

Sie Ereignis zuerst abgeschlossen registrieren sollten, bevor wie diese Aussage Aufruf beginnen:

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

Sie bestanden i als Parameter, aber sie haben es nicht oder dessen Wert verwenden, um zu bestimmen. So müssen Sie TargetAnimation(int i) Wert mit If-Anweisung, die gleich der Zielanimation Wert ist, die i ist

2

Ich glaube, Sie missverstehen StoryBoard.Completed. Sie sollten den Delegaten auf da.Completed anwenden.

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