Übersicht über ZeitsteuerungsereignisseTiming Events Overview

In diesem Thema wird beschrieben, wie Timeline Clock die fünf verfügbaren Zeitereignisse und Objekte verwendet werden.This topic describes how to use the five timing events available on Timeline and Clock objects.

VoraussetzungenPrerequisites

Als Voraussetzung für dieses Thema sollten Sie wissen, wie Animationen erstellt und verwendet werden.To understand this topic, you should understand how to create and use animations. Informationen zu den ersten Informationen finden Sie in der Animationsübersicht.To get started with animation, see the Animation Overview.

Es gibt mehrere Möglichkeiten, WPFWPFEigenschaften in zu animieren:There are multiple ways to animate properties in WPFWPF:

Da Sie sie in Markup und Code verwenden Storyboard können, verwenden die Beispiele in dieser Übersicht Objekte.Because you can use them in markup and code, the examples in this overview use Storyboard objects. Die beschriebenen Konzepte können jedoch auf die anderen Methoden der Animation von Eigenschaften angewendet werden.However, the concepts described can be applied to the other methods of animating properties.

Was ist eine Uhr?What is a clock?

Eine Zeitachse beschreibt eigentlich lediglich einen Zeitabschnitt.A timeline, by itself, doesn't actually do anything other than describe a segment of time. Es ist das Clock Objekt der Zeitachse, das die eigentliche Arbeit leistet: Es behält den zeitbezogenen Laufzeitstatus für die Zeitachse bei.It's the timeline's Clock object that does the real work: it maintains timing-related run-time state for the timeline. In den meisten Fällen, z.B. bei Verwendung von Storyboards, wird für die Zeitachse automatisch eine Uhr erstellt.In most cases, such as when using storyboards, a clock is created automatically for your timeline. Sie können auch Clock eine explizit CreateClock eerstellen, indem Sie die Methode verwenden.You can also create a Clock explicitly by using the CreateClock method. Weitere Informationen Clock zu Objekten finden Sie in der Animation und Timing System Overview.For more information about Clock objects, see the Animation and Timing System Overview.

Gründe für die Verwendung von EreignissenWhy Use Events?

Bis auf einen (ausgerichtet am letzten Teilstrich) sind alle interaktiven Zeitsteuerungsvorgänge asynchron.With the exception of one (seek aligned to last tick), all interactive timing operations are asynchronous. Sie haben keine Möglichkeit, den genauen Zeitpunkt ihrer Ausführung herauszufinden.There is no way for you to know exactly when they will execute. Dies kann problematisch sein, wenn Sie anderen Code haben, der von Ihrem Zeitsteuerungsvorgang abhängig ist.That can be a problem when you have other code that's dependent upon your timing operation. Angenommen, Sie möchten eine Zeitachse stoppen, die ein Rechteck animiert.Suppose that you wanted to stop a timeline that animated a rectangle. Nachdem die Zeitachse gestoppt wurde, können Sie die Farbe des Rechtecks ändern.After the timeline stops, you change the color of the rectangle.

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.In the previous example, the second line of code might execute before the storyboard stops. Das liegt daran, dass das Stoppen ein asynchroner Vorgang ist.That's because stopping is an asynchronous operation. 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.Telling a timeline or clock to stop creates a "stop request" of sorts that isn't processed until the timing engine's next tick.

Verwenden Sie zum Ausführen von Befehlen nach dem Abschluss einer Zeitachse Zeitsteuerungsereignisse.To execute commands after a timeline completes, use timing events. Im folgenden Beispiel wird ein Ereignishandler verwendet, um die Farbe eines Rechtecks ändern, nachdem die Storyboard-Wiedergabe gestoppt wurde.In the following example, an event handler is used to change the color of a rectangle after the storyboard stops playing.

// 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ändigeres Beispiel finden Sie unter Empfangen von Benachrichtigungen, wenn sich der Status einer Uhr ändert.For a more complete example, see Receive Notification When a Clock's State Changes.

Öffentliche EreignissePublic Events

Die Timeline Clock und die Klassen bieten fünf Timing-Ereignisse.The Timeline and Clock classes both provide five timing events. Die folgende Tabelle enthält diese Ereignisse und die Umstände, die sie auslösen.The following table lists these events and the conditions that trigger them.

EreignisEvent Auslösen von interaktiven VorgängenTriggering interactive operation Andere TriggerOther triggers
ErledigtCompleted Zur Füllung überspringenSkip to fill Die Uhr wird beendet.The clock completes.
CurrentGlobalSpeedInvalidatedCurrentGlobalSpeedInvalidated Anhalten, Fortsetzen, Suchen, Geschwindigkeitsverhältnis festlegen, Zur Füllung überspringen, StoppenPause, resume, seek, set speed ratio, skip to fill, stop Die Uhr kehrt um, beschleunigt, startet oder stoppt.The clock reverses, accelerates, starts, or stops.
CurrentStateInvalidatedCurrentStateInvalidated Beginnen, Zur Füllung überspringen, StoppenBegin, skip to fill, stop Die Uhr startet, stoppt oder füllt.The clock starts, stops, or fills.
CurrentTimeInvalidatedCurrentTimeInvalidated Beginnen, Suchen, Zur Füllung überspringen, StoppenBegin, seek, skip to fill, stop Die Uhr läuft.The clock progresses.
RemoveRequestedRemoveRequested Remove (Entfernen)Remove

Teilstrich- und EreigniskonsolidierungTicking and Event Consolidation

Wenn Sie Objekte WPFWPFin animieren, ist es die Timing-Engine, die Ihre Animationen verwaltet.When you animate objects in WPFWPF, it’s the timing engine that manages your animations. Die Zeitsteuerungs-Engine verfolgt den zeitlichen Ablauf und berechnet den Status der einzelnen Animationen.The timing engine tracks the progression of time and computes the state of each animation. In einer Sekunde werden viele dieser Auswertungsdurchläufe durchgeführt.It makes many such evaluation passes in a second. Die Auswertungsdurchläufe heißen „Teilstriche“.These evaluation passes are known as "ticks."

Wenn Ticks häufiger auftreten, kann zwischen den einzelnen Ticks Vieles geschehen.While ticks occur frequently, it's possible for a lot of things to happen between ticks. Beispielsweise kann eine Zeitachse gestoppt, gestartet und wieder gestoppt werden. In diesem Fall ändert sich ihr aktueller Status drei Mal.For example, a timeline might be stopped, started, and stopped again, in which case its current state will have changed three times. 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.In theory, the event could be raised multiple times in a single tick; however, the timing engine consolidates events, so that each event can be raised at most once per tick.

Registrieren für EreignisseRegistering for Events

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.There are two ways to register for timing events: you can register with the timeline or with the clock created from the timeline. Registrierung für ein Ereignis direkt bei einer Uhr ist relativ einfach, obwohl sie nur über Code ausgeführt werden kann.Registering for an event directly with a clock is fairly straightforward, although it can only be done from code. Sie können sich über Markup oder Code für Ereignisse bei einer Zeitachse registrieren.You can register for events with a timeline from markup or code. Im nächsten Abschnitt wird beschrieben, wie sie sich für Uhrereignisse bei einer Zeitachse registrieren.The next section describes how to register for clock events with a timeline.

Registrieren für Uhrereignisse bei einer ZeitachseRegistering for Clock Events with a Timeline

CompletedObwohl die Ereignisse CurrentGlobalSpeedInvalidated, CurrentStateInvalidated CurrentTimeInvalidated, RemoveRequested , und Ereignisse einer Zeitachse der Zeitachse zugeordnet zu sein Clock scheinen, ordnet die Registrierung für diese Ereignisse tatsächlich einen Ereignishandler dem für die Zeitachse erstellten Ereignishandler zu.Although a timeline's Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated, and RemoveRequested events appear to be associated with the timeline, registering for these events actually associates an event handler with the Clock created for the timeline.

Wenn Sie sich Completed z. B. auf einer Zeitachse für das Ereignis Completed registrieren, sagen Sie dem System, dass es sich für das Ereignis jeder Uhr registrieren soll, die für die Zeitachse erstellt wird.When you register for the Completed event on a timeline, for example, you're actually telling the system to register for the Completed event of each clock that is created for the timeline. Im Code müssen Sie sich für Clock dieses Ereignis registrieren, bevor der für diese Zeitachse erstellt wird. Andernfalls erhalten Sie keine Benachrichtigung.In code, you must register for this event before the Clock is created for this timeline; otherwise, you won't receive notification. Dies geschieht XAMLXAMLautomatisch in ; Der Parser registriert sich automatisch Clock für das Ereignis, bevor der erstellt wird.This happens automatically in XAMLXAML; the parser automatically registers for the event before the Clock is created.

Weitere InformationenSee also