Freigeben über


Übersicht über Timing-Ereignisse

In diesem Thema wird beschrieben, wie Sie die fünf verfügbaren Zeitsignalereignisse für Timeline und Clock Objekte verwenden.

Voraussetzungen

Um dieses Thema zu verstehen, sollten Sie verstehen, wie Animationen erstellt und verwendet werden. Informationen zu den ersten Schritten mit Animationen finden Sie in der Animationsübersicht.

Es gibt mehrere Möglichkeiten zum Animieren von Eigenschaften in WPF:

Da Sie sie in Markup und Code verwenden können, verwenden Storyboard die Beispiele in dieser Übersicht Objekte. Die beschriebenen Konzepte können jedoch auf die anderen Methoden zum Animieren von Eigenschaften angewendet werden.

Was ist eine Uhr?

Eine Zeitachse selbst macht eigentlich nichts anderes als ein Segment der Zeit zu beschreiben. Es ist das Objekt der Zeitachse Clock , das die eigentliche Arbeit ausführt: Es behält den zeitgesteuerten Laufzeitzustand für die Zeitachse bei. In den meisten Fällen, z. B. bei der Verwendung von Storyboards, wird automatisch eine Uhr für Ihre Zeitachse erstellt. Sie können eine Clock auch explizit erstellen, indem Sie die CreateClock Methode verwenden. Weitere Informationen zu Clock Objekten finden Sie unter " Animation and Timing System Overview".

Warum Ereignisse verwenden?

Mit Ausnahme einer (Suche ausgerichtet auf den letzten Zeitstrich) sind alle interaktiven Zeitvorgänge asynchron. Es gibt keine Möglichkeit, genau zu wissen, wann sie ausgeführt werden. Dies kann ein Problem sein, wenn Sie einen anderen Code haben, der von Ihrem Timing-Vorgang abhängig ist. Angenommen, Sie wollten eine Zeitleiste anhalten, die ein Rechteck animiert. Nachdem die Zeitachse angehalten ist, ä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 kann die zweite Codezeile ausgeführt werden, bevor das Storyboard beendet wird. Das liegt daran, dass das Beenden ein asynchroner Vorgang ist. Wenn Sie eine Zeitachse oder eine Uhr zum Beenden auffordern, wird eine Art "Stoppanforderung" erstellt, die erst beim nächsten Tick der Timing-Engine verarbeitet wird.

Verwenden Sie Timing-Ereignisse, um Befehle nach Abschluss einer Zeitachse auszuführen. Im folgenden Beispiel wird ein Ereignishandler verwendet, um die Farbe eines Rechtecks zu ändern, nachdem das Storyboard nicht mehr wiedergegeben wird.

// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);
' Register for the CurrentStateInvalidated timing event.
AddHandler myStoryboard.CurrentStateInvalidated, AddressOf myStoryboard_CurrentStateInvalidated
// Change the rectangle's color after the storyboard stops.
void myStoryboard_CurrentStateInvalidated(object sender, EventArgs e)
{
    Clock myStoryboardClock = (Clock)sender;
    if (myStoryboardClock.CurrentState == ClockState.Stopped)
    {
        myRectangle.Fill = Brushes.Blue;
    }
}
' Change the rectangle's color after the storyboard stops. 
Private Sub myStoryboard_CurrentStateInvalidated(ByVal sender As Object, ByVal e As EventArgs)
    Dim myStoryboardClock As Clock = CType(sender, Clock)
    If myStoryboardClock.CurrentState = ClockState.Stopped Then
        myRectangle.Fill = Brushes.Blue
    End If
End Sub

Ein vollständiges Beispiel finden Sie unter "Empfangen von Benachrichtigungen beim Ändern des Zustands einer Uhr".

Öffentliche Ereignisse

Die Klassen Timeline und Clock bieten beide fünf Timing-Ereignisse an. In der folgenden Tabelle sind diese Ereignisse und die Bedingungen aufgeführt, die sie auslösen.

Ereignis Auslösen eines interaktiven Vorgangs Andere Trigger
Abgeschlossen Zum Ausfüllen springen Die Uhr vollendet.
AktuelleGlobaleGeschwindigkeitUngültigGemacht Anhalten, Fortsetzen, Suchen, Geschwindigkeitsverhältnis festlegen, zum Ausfüllen springen, beenden Die Uhr kehrt um, beschleunigt, startet oder stoppt.
AktuellerStatusUngültig Beginnen, zum Ausfüllen springen, beenden Die Uhr startet, hält an oder setzt sich zurück.
AktuelleZeitUngültig Beginnen, suchen, zum Ausfüllen springen, beenden Die Uhr läuft weiter.
Entfernung angefordert Entfernen

Teilstrich- und Ereigniskonsolidierung

Wenn Sie Objekte in WPF animieren, ist es das Timing-Modul, das Ihre Animationen verwaltet. Das Timing-Modul verfolgt den Verlauf der Zeit und berechnet den Zustand jeder Animation. Es führt pro Sekunde viele solcher Bewertungsdurchläufe durch. Diese Auswertungsdurchläufe werden als "Ticks" bezeichnet.

Während Ticks häufig auftreten, ist es möglich, dass viele Dinge zwischen Zecken passieren. Beispielsweise kann eine Zeitachse angehalten, gestartet und erneut beendet werden, in diesem Fall hat sich der aktuelle Zustand dreimal geändert. Theoretisch könnte das Ereignis in einem einzigen Takt mehrmals ausgelöst werden; das Zeittaktmodul konsolidiert jedoch Ereignisse, sodass jedes Ereignis höchstens einmal pro Takt ausgelöst werden kann.

Registrieren für Ereignisse

Es gibt zwei Möglichkeiten zur Registrierung für Zeitsteuerungsereignisse: Sie können sich mit der Zeitachse oder mit dem Zeitgeber registrieren, der aus der Zeitachse erstellt wurde. Die direkte Registrierung für ein Ereignis mit einer Uhr ist relativ einfach, kann aber nur über Code erfolgen. Sie können sich für Veranstaltungen mithilfe einer Zeitplanung aus Markup oder Code registrieren. Im nächsten Abschnitt wird beschrieben, wie Sie sich für Uhrenereignisse mit einer Zeitleiste registrieren.

Registrieren für Uhrenereignisse mit einer Zeitachse

Obwohl die Ereignisse Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated und RemoveRequested einer Zeitachse mit der Zeitachse verbunden zu sein scheinen, wird durch die Registrierung für diese Ereignisse tatsächlich ein Ereignishandler mit dem für die Zeitachse erstellten Clock verknüpft.

Wenn Sie sich für das Completed Ereignis auf einer Zeitachse registrieren, geben Sie dabei dem System tatsächlich an, dass es sich für das Completed Ereignis jeder Uhr registriert, die für die Zeitachse angelegt wird. Im Code müssen Sie sich für dieses Ereignis registrieren, bevor das Clock Ereignis für diese Zeitachse erstellt wird. Andernfalls erhalten Sie keine Benachrichtigung. Dies geschieht automatisch in XAML; der Parser registriert sich automatisch für das Ereignis, bevor das Clock Ereignis erstellt wird.

Siehe auch