Ich habe ein Storyboard, das ich benutze, um einige Bilder zu animieren, ich möchte nach jeder Animation einige Operationen ausführen, die einige Berechnungen enthalten, und dann eine andere Animation ausführen, also sollte ich das abgeschlossene Event Was mich interessiert, ist, soll ich die nächste Animation im% code% des aktuellen StoryBoards starten? Und gibt es irgendwelche Auswirkungen, wenn ich die erste Animation in einem separaten Thread mit dem Application.Current.Dispatcher-Objekt gestartet habe? Wenn ich StoryBoard.Begin () in einem separaten Thread mit dem Application.Current.Dispatcher aufgerufen habe, wird das Storyboard_Completed-Ereignis auch im UI-Thread aufgerufen? Muss ich in diesem Fall die nächste Animation noch in einen anderen Dispatcher Invoke einbinden? Stimmt das? Oder gibt es eine bessere Möglichkeit zu überprüfen, ob ein Storyboard beendet wurde und die nächsten Berechnungen zu starten? Storyboard Animation gleich danach? Ich habe daran gedacht, einen einzelnen Hintergrundarbeiter zu verwenden, um alle Animationen und Berechnungen nacheinander zu handhaben, aber ich frage mich auch, wie ich "warten" soll, bis die Animation abgeschlossen ist, bevor ich mit den nächsten Berechnungen und Animationen beginne. Ist es normal, dass ein BackGroundWorker MyStoryboard.Completed += storyboard_Completed;
Storyboard_Completed Event
hat, während er auf die Beendigung der Animation wartet?
Sie können das Storyboard in ein Task -Objekt und
Hier ist ein ausgezeichneter Beispielcode, der zeigt, wie man genau das macht, aus einem Blogpost von Morten Nielsen:
%Vor%Im Wesentlichen erstellen Sie eine Erweiterungsmethode, die ein Task-Objekt zurückgibt, das die Fertigstellung des Storyboards signalisiert. Auf diese Weise erhalten Sie eine schöne flüssige Syntax wie folgt:
%Vor%Verwenden Sie das Storyboard.Completed-Ereignis sollte für Ihre Zwecke funktionieren. Der Storyboard.Completed-Ereignishandler sollte auf dem UI-Thread ausgelöst werden, sodass Sie Application.Current.Dispatcher.Invoke nicht aufrufen müssen, um das zweite Storyboard auszulösen.
Es sollte keine Auswirkungen haben, wenn Sie das ursprüngliche Storyboard.Begin mit Application.Current.Dispatcher.Invoke aufrufen. Dadurch wird die Storyboard-Animation nicht in einem neuen Thread gestartet. Es ruft die Animation im Haupt-UI-Thread asynchron auf. Unabhängig davon, ob Sie Begin auf dem UI-Thread selbst aufrufen oder ob Sie Application.Current.Dispatcher.Invoke verwenden, um das zu tun, sollte das Endergebnis dasselbe sein. Ihr abgeschlossener Event-Handler wird ausgelöst, wenn das Storyboard fertig ist, und Sie können Ihre Berechnungen durchführen und das nächste Storyboard auslösen.
Sehen Sie sich die folgende Frage an, wenn Storyboard in der Vergangenheit als Timer verwendet wurde, da es im UI-Thread ausgeführt wird:
Wozu dient Storyboard als Timer?
Auch das ist wahrscheinlich zu viel für den speziellen Fall, den Sie beschreiben, aber wenn Sie eine Reihe sequentieller, asynchroner Operationen orchestrieren müssen, könnten Sie Reaktive Erweiterungen verwenden:
Der folgende Artikel enthält ein sequenzielles Storyboard-Beispiel (obwohl der Artikel alt genug ist, dass die Syntax wahrscheinlich geändert hat):
Tags und Links wpf wpf-controls