Übersicht über Zeitsteuerungsereignisse
In diesem Thema wird beschrieben, wie die fünf Zeitsteuerungsereignisse verwendet werden, die für Timeline-Objekte und Clock-Objekte verfügbar sind.
Vorbereitungsmaßnahmen
Für dieses Thema sollten Sie mit der Erstellung und Verwendung von Animationen vertraut sein. Einführende Informationen zur Animation finden Sie unter Übersicht über Animationen.
Es gibt mehrere Möglichkeiten, Eigenschaften in WPF zu animieren:
Mit Storyboard-Objekten (Markup und Code): Sie können Storyboard-Objekte verwenden, um Animationen anzuordnen und auf ein oder mehrere Objekte zu verteilen. Ein Beispiel finden Sie unter Gewusst wie: Animieren einer Eigenschaft unter Verwendung eines Storyboards.
Mit lokalen Animationen (nur Code): Sie können AnimationTimeline-Objekte direkt auf die Eigenschaften anwenden, die sie animieren. Ein Beispiel finden Sie unter Gewusst wie: Animieren einer Eigenschaft ohne Storyboard.
Mit Uhren (nur Code): Sie können die Erstellung von Uhren explizit verwalten und die Animationsuhren selbst verteilen. Ein Beispiel finden Sie unter Gewusst wie: Animieren einer Eigenschaft mit AnimationClock.
In den Beispielen dieser Übersicht werden Storyboard-Objekte verwendet, weil Sie sie sowohl in Markup als auch Code verwenden können. Die beschriebenen Konzepte gelten jedoch auch für andere Methoden zur Animation von Eigenschaften.
Was ist eine Uhr?
Eine Zeitachse selbst hat lediglich die Funktion, einen bestimmten Zeitabschnitt zu beschreiben. Die eigentliche Arbeit übernimmt das Clock-Objekt der Zeitachse: Es behält den zeitbezogenen Laufzeitzustand der Zeitachse bei. In den meisten Fällen, z. B. bei der Verwendung von Storyboards, wird für die Zeitachse automatisch eine Uhr erstellt. Sie können eine Clock auch explizit mit der CreateClock-Methode erstellen. Weitere Informationen über Clock-Objekte finden Sie unter Übersicht über das Animations- und Zeitsteuerungssystem.
Gründe für die Verwendung von Ereignissen
Mit Ausnahme eines Vorgangs (SeekAlignedToLastTick) sind alle interaktiven Zeitsteuerungsvorgänge asynchron. Sie haben keine Möglichkeit festzustellen, wann genau sie ausgeführt werden. Das kann zu Problemen führen, wenn Sie anderen Code haben, der von einem Zeitsteuerungsvorgang abhängig ist. Angenommen, Sie möchten eine Zeitachse anhalten, die ein Rechteck animiert hat. Nachdem die Zeitachse angehalten wurde, ändern Sie die Farbe des Rechtecks.
myStoryboard.Stop(myRectangle)
' This statement might execute
' before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue
myStoryboard.Stop(myRectangle);
// This statement might execute
// before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue;
Im vorherigen Beispiel könnte die zweite Codezeile ausgeführt werden, bevor das Storyboard beendet wird. Das liegt daran, dass das Beenden ein asynchroner Vorgang ist. Beim Beenden einer Zeitachse oder einer Uhr wird eine "Beendigungsanforderung" erstellt, die erst beim nächsten Teilstrich des Zeitgebermoduls bearbeitet wird.
Um Befehle auszuführen, nachdem eine Zeitachse abgeschlossen wurde, verwenden Sie Zeitsteuerungsereignisse. Im folgenden Beispiel wird ein Ereignishandler verwendet, um die Farbe eines Rechtecks zu ändern, nachdem die Wiedergabe des Storyboards beendet wurde.
' Register for the CurrentStateInvalidated timing event.
AddHandler myStoryboard.CurrentStateInvalidated, AddressOf myStoryboard_CurrentStateInvalidated
// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);
Ein ausführlicheres Beispiel finden Sie unter Gewusst wie: Empfangen von Benachrichtigungen bei Statusänderungen der Uhr.
Öffentliche Ereignisse
Die Timeline-Klasse und die Clock-Klasse stellen beide jeweils fünf Zeitsteuerungsereignisse zur Verfügung. In der folgenden Tabelle werden diese Ereignisse und die Bedingungen, die sie auslösen, aufgelistet.
Ereignis |
Auslösender interaktiver Vorgang |
Andere Trigger |
---|---|---|
Abgeschlossen |
Zum Ende des Füllzeitraums springen |
Die Uhr wird beendet. |
CurrentGlobalSpeedInvalidated |
Anhalten, Fortsetzen, Suchen, Geschwindigkeitsverhältnis festlegen, zum Ende des Füllzeitraums springen, Beenden |
Die Uhr kehrt um, beschleunigt, startet oder wird beendet. |
CurrentStateInvalidated |
Starten, zum Ende des Füllzeitraums springen, Beenden |
Die Uhr startet, wird beendet oder ans Ende des Füllzeitraums gesetzt. |
CurrentTimeInvalidated |
Starten, Suchen, zum Ende des Füllzeitraums springen, Beenden |
Die Uhr schreitet fort. |
RemoveRequested |
Entfernen |
Teilstriche und Ereigniskonsolidierung
Wenn Sie Objekte in WPF animieren, werden die Animationen vom Zeitgebermodul verwaltet. Das Zeitgebermodul verfolgt den zeitlichen Ablauf und berechnet den Zustand jeder Animation. Innerhalb einer einzelnen Sekunde führt es viele solcher Evaluierungsdurchläufe durch. Diese Evaluierungsdurchläufe werden als "Teilstriche" bezeichnet.
Teilstriche treten häufig auf, und es können viele Dinge zwischen einzelnen Teilstrichen geschehen. Beispielsweise kann eine Zeitachse angehalten, gestartet und wieder angehalten werden. Dabei hätte sich der aktuelle Zustand der Zeitachse insgesamt dreimal geändert. Theoretisch kann dieses Ereignis für einen einzelnen Teilstrich mehrere Male ausgelöst werden. Das Zeitgebermodul konsolidiert jedoch Ereignisse, sodass jedes Ereignis höchstens einmal pro Teilstrich ausgelöst werden kann.
Registrieren für Ereignisse
Es gibt zwei Methoden, sich für Zeitsteuerungsereignisse zu registrieren: Sie können sich über die Zeitachse oder über die Uhr, die aus der Zeitachse erstellt wurde, registrieren. Die direkte Registrierung für ein Ereignis über eine Uhr ist relativ einfach, kann jedoch nur über Code ausgeführt werden. Über eine Zeitachse können Sie sich sowohl über Markup als auch über Code für Ereignisse registrieren. Im nächsten Abschnitt wird beschrieben, wie eine Registrierung für Uhrenereignisse über eine Zeitachse durchgeführt wird.
Registrieren für Uhrereignisse mithilfe einer Zeitachse
Obwohl die Ereignisse Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated und RemoveRequested einer Zeitachse dieser Zeitachse zugeordnet zu sein scheinen, wird der für die Zeitachse erstellten Clock bei der Registrierung für diese Ereignisse ein Ereignishandler zugeordnet.
Wenn Sie sich beispielsweise für das Completed-Ereignis einer Zeitachse registrieren, veranlassen Sie damit, dass sich das System für das Completed-Ereignis jeder Uhr registriert, die für die Zeitachse erstellt wird. Im Code müssen Sie sich für dieses Ereignis registrieren, bevor die Clock für diese Zeitachse erstellt wird. Andernfalls erhalten Sie keine Benachrichtigung. Dies geschieht in XAML automatisch. Der Parser registriert sich automatisch für das Ereignis, bevor die Clock erstellt wird.