WPF - sequentielle animation einfaches Beispiel
Lerne ich über WPF-animation, und bin verwirrt darüber, wie Sie anwenden, Animationen nacheinander. Als einfaches Beispiel, ich habe vier Rechtecke in ein gleichmäßiges raster, und möchten, ändern Sie die Farbe jedes der Reihe nach. Hier ist, was ich habe, so weit:
public partial class Window1 : Window
{
Rectangle blueRect;
Rectangle redRect;
Rectangle greenRect;
Rectangle yellowRect;
public Window1()
{
InitializeComponent();
blueRect = new Rectangle() { Fill = System.Windows.Media.Brushes.Blue, Name="Blue"};
redRect = new Rectangle() { Fill = System.Windows.Media.Brushes.Red, Name="Yellow"};
greenRect = new Rectangle() { Fill = System.Windows.Media.Brushes.Green, Name="Green" };
yellowRect = new Rectangle() { Fill = System.Windows.Media.Brushes.Yellow, Name="Yellow" };
UniformGrid1.Children.Add(blueRect);
UniformGrid1.Children.Add(redRect);
UniformGrid1.Children.Add(greenRect);
UniformGrid1.Children.Add(yellowRect);
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
animateCell(blueRect, Colors.Blue);
animateCell(redRect, Colors.Red);
}
private void animateCell(Rectangle rectangle, Color fromColor)
{
Color toColor = Colors.White;
ColorAnimation ani = new ColorAnimation(toColor, new Duration(TimeSpan.FromMilliseconds(300)));
ani.AutoReverse = true;
SolidColorBrush newBrush = new SolidColorBrush(fromColor);
ani.BeginTime = TimeSpan.FromSeconds(2);
rectangle.Fill = newBrush;
newBrush.BeginAnimation(SolidColorBrush.ColorProperty, ani);
//NameScope.GetNameScope(this).RegisterName(rectangle.Name, rectangle);
//Storyboard board = new Storyboard();
//board.Children.Add(ani);
//Storyboard.SetTargetName(rectangle, rectangle.Name);
//Storyboard.SetTargetProperty(ani, new PropertyPath(SolidColorBrush.ColorProperty));
//board.Begin();
}
Was ist der einfachste Weg, dies zu erreichen? Der code in den Kommentaren ist meine erste Vermutung, aber es funktioniert nicht richtig.
InformationsquelleAutor David Hodgson | 2009-10-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte es ein Ereignis sein
ani.Completed
- handle, das Ereignis und starten Sie die nächste phase der animation, dann starten Sie den ersten Computer und jede phase löst die nächste.UPDATE:
Versuchen einfügen, die oben in Ihrem Programm. Es tut das, was Sie brauchen, aber in einer Weise, die nützlich sein können, um Sie in anderen Kontexten. Es ist immer noch event-driven, aber es verwendet einen "iterator-Methode" (mit Rendite), den Eindruck zu erwecken, dass es sequenzielle Codierung, die Blöcke, während die animation läuft.
Die nette Sache über dieses ist, dass Sie spielen, um mit den AnimationSequence Methode in eine sehr intuitive Art und Weise - man könnte schreiben Sie die Zeitleiste der animation in einer Reihe von Anweisungen, oder verwenden Sie Schleifen, oder was auch immer Sie wollen.
InformationsquelleAutor Daniel Earwicker
Die Lösung, die ich ausprobiert habe, ist die Verwendung einer Warteschlange, wie so. Dies wird Ihnen erlauben, fügen Sie die animation der Kette dynamisch. Ich bin mir nicht sicher, ob die Sperre ist notwendig, aber ich habe es in nur um sicher zu sein.
InformationsquelleAutor Edward D'Souza
Dies kann erreicht werden, indem eine Klasse mit dem widersprüchlichen Namen
ParallelTimeline
und sorgfältiges anpassen derBeginTime
Eigenschaft. Beachten Sie in dem Beispiel unten, wie dieBeginTime
- Eigenschaft des zweitenDoubleAnimation
ist auf die Dauer des ersten.InformationsquelleAutor vidstige