Übersicht über Zeitsteuerungsereignisse

Dieser Artikel beschreibt die Verwendung der fünf Zeitsteuerungsereignisse, die in den Objekten Timeline und Clock verfügbar sind.

Voraussetzungen

Als Voraussetzung für dieses Thema sollten Sie wissen, wie Animationen erstellt und verwendet werden. Informationen über die ersten Schritte mit Animationen finden Sie unter Übersicht über Animationen.

Es gibt mehrere Methoden zum Animieren von Eigenschaften in WPF:

Da Sie diese im Markup und Code verwenden können, verwenden die Beispiele in dieser Übersicht Storyboard-Objekte. Die beschriebenen Konzepte können jedoch auf die anderen Methoden der Animation von Eigenschaften angewendet werden.

Was ist eine Uhr?

Eine Zeitachse beschreibt eigentlich lediglich einen Zeitabschnitt. Das Clock-Objekt der Zeitachse übernimmt die eigentliche Arbeit: Es pflegt die zeitsteuerungsbezogenen Laufzeitstatus für Zeitachse. In den meisten Fällen, z.B. bei Verwendung von Storyboards, wird für die Zeitachse automatisch eine Uhr erstellt. Sie können auch eine Clock explizit mithilfe der Methode CreateClock erstellen. Weitere Informationen zu Clock-Objekten finden Sie unter Übersicht über das Animations- und Zeitsteuerungssystem.

Gründe für die Verwendung von Ereignissen

Bis auf einen (ausgerichtet am letzten Teilstrich) sind alle interaktiven Zeitsteuerungsvorgänge asynchron. Sie haben keine Möglichkeit, den genauen Zeitpunkt ihrer Ausführung herauszufinden. Dies kann problematisch sein, wenn Sie anderen Code haben, der von Ihrem Zeitsteuerungsvorgang abhängig ist. Angenommen, Sie möchten eine Zeitachse stoppen, die ein Rechteck animiert. Nachdem die Zeitachse gestoppt wurde, können Sie die Farbe des Rechtecks ändern.

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 gestoppt wird. Das liegt daran, dass das Stoppen ein asynchroner Vorgang ist. Wenn das Stoppen einer Zeitachse oder Uhr angefordert wird, wird eine Art „Beendigungsanforderung“ erstellt, die erst nach dem nächsten Teilstrich der Zeitsteuerungs-Engine verarbeitet wird.

Verwenden Sie zum Ausführen von Befehlen nach dem Abschluss einer Zeitachse Zeitsteuerungsereignisse. Im folgenden Beispiel wird ein Ereignishandler verwendet, um die Farbe eines Rechtecks ändern, nachdem die Storyboard-Wiedergabe gestoppt wurde.

// 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 ausführlicheres Beispiel finden Sie unter Empfangen von Benachrichtigungen bei Statusänderungen der Uhr.

Öffentliche Ereignisse

Die Timeline beiden Clock Klassen bieten fünf Zeitsteuerungsereignisse. Die folgende Tabelle enthält diese Ereignisse und die Umstände, die sie auslösen.

Ereignis Auslösen von interaktiven Vorgängen Andere Trigger
Abgeschlossen Zur Füllung überspringen Die Uhr wird beendet.
CurrentGlobalSpeedInvalidated Anhalten, Fortsetzen, Suchen, Geschwindigkeitsverhältnis festlegen, Zur Füllung überspringen, Stoppen Die Uhr kehrt um, beschleunigt, startet oder stoppt.
CurrentStateInvalidated Beginnen, Zur Füllung überspringen, Stoppen Die Uhr startet, stoppt oder füllt.
CurrentTimeInvalidated Beginnen, Suchen, Zur Füllung überspringen, Stoppen Die Uhr läuft.
RemoveRequested Remove (Entfernen)

Teilstrich- und Ereigniskonsolidierung

Wenn Sie Objekte in WPF animieren, werden Ihre Animationen von der Zeitsteuerungs-Engine verwaltet. Die Zeitsteuerungs-Engine verfolgt den zeitlichen Ablauf und berechnet den Status der einzelnen Animationen. In einer Sekunde werden viele dieser Auswertungsdurchläufe durchgeführt. Die Auswertungsdurchläufe heißen „Teilstriche“.

Wenn Ticks häufiger auftreten, kann zwischen den einzelnen Ticks Vieles geschehen. Beispielsweise kann eine Zeitachse gestoppt, gestartet und wieder gestoppt werden. In diesem Fall ändert sich ihr aktueller Status drei Mal. Theoretisch kann das Ereignis mehrere Male in einem Teilstrich ausgelöst werden. Die Zeitsteuerungs-Engine konsolidiert jedoch Ereignisse, damit jedes Ereignis höchstens einmal pro Teilstrich ausgelöst werden kann.

Registrieren für Ereignisse

Es gibt mehrere Möglichkeiten, um sich für Zeitsteuerungsereignisse zu registrieren: Sie könne sich bei der Zeitachse oder der aus der Zeitachse erstellten Uhr registrieren. Registrierung für ein Ereignis direkt bei einer Uhr ist relativ einfach, obwohl sie nur über Code ausgeführt werden kann. Sie können sich über Markup oder Code für Ereignisse bei einer Zeitachse registrieren. Im nächsten Abschnitt wird beschrieben, wie sie sich für Uhrereignisse bei einer Zeitachse registrieren.

Registrieren für Uhrereignisse bei einer Zeitachse

Obwohl die Ereignisse Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated, und RemoveRequested einer Zeitachse scheinbar der Zeitachse zugeordnet sind, ordnet die Registrierung für diese Ereignisse tatsächlich einen Ereignishandler mit dem für die Zeitachse erstellten Clock zu.

Wenn Sie auf einer Zeitachse beispielsweise für das Ereignis Completed registrieren, weisen Sie das System tatsächlich dazu an, für das Ereignis Completed jeder für die Zeitachse erstellten Uhr zu registrieren. 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 automatisch in XAML. Der Parser registriert sich automatisch für das Ereignis, bevor die Clock erstellt wird.

Siehe auch