Übersicht über ZeitsteuerungsereignisseTiming Events Overview

In diesem Thema wird beschrieben, wie mit den fünf Zeitsteuerungsereignisse auf Timeline und Clock Objekte.This topic describes how to use the five timing events available on Timeline and Clock objects.

VorraussetzungenPrerequisites

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. Um den ersten Schritten mit Animationen finden Sie unter den Übersicht über Animationen.To get started with animation, see the Animation Overview.

Es gibt mehrere Möglichkeiten zum Animieren von Eigenschaften in WPFWPF:There are multiple ways to animate properties in WPFWPF:

Da Sie diese im Markup und Code verwenden können, verwenden Sie in die Beispielen in dieser Übersicht Storyboard 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. Die Zeitachse Clock -Objekt, das die eigentliche Arbeit: Es verwaltet die zeitbezogenen Laufzeitzustand für die Zeitachse.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 erstellen, eine Clock explizit durch Verwenden der CreateClock Methode.You can also create a Clock explicitly by using the CreateClock method. Weitere Informationen zu Clock Objekten finden Sie die Animation und zeitliche Steuerung Systemübersicht.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 bei einer Statusänderungen der Uhr.For a more complete example, see Receive Notification When a Clock's State Changes.

Öffentliche EreignissePublic Events

Die Timeline und Clock -Klasse bieten fünf Zeitsteuerungsereignisse.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.

eventEvent Auslösen von interaktiven VorgängenTriggering interactive operation Andere TriggerOther triggers
AbgeschlossenCompleted 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 RemoveRemove

Teilstrich- und EreigniskonsolidierungTicking and Event Consolidation

Wenn Sie animieren von Objekten im WPFWPF, es ist die zeitsteuerungs-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 Teilstriche häufiger auftreten, können zwischen den einzelnen Teilstrichen viele Dinge 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

Obwohl einer Zeitachse Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated, und RemoveRequested Ereignisse angezeigt, bei der Zeitachse, die Registrierung für diese Ereignisse ordnet einen Ereignishandler mit verknüpft werden, die Clock für die Zeitachse erstellt.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.

Beim Registrieren für die Completed Ereignis auf einer Zeitachse beispielsweise veranlassen Sie das System zum Registrieren für die Completed -Ereignis jeder Uhr, die erstellt wird, wird für die Zeitachse.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 für dieses Ereignis vor dem Registrieren der Clock 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 automatisch in XAMLXAML; der Parser registriert sich automatisch für das Ereignis vor dem Clock erstellt wird.This happens automatically in XAMLXAML; the parser automatically registers for the event before the Clock is created.

Siehe auchSee also