Übersicht über das Animations- und Zeitsteuerungssystem

Dieses Thema beschreibt, wie das Timing-System die Animation, Timeline- und Clock-Klassen verwendet, um Eigenschaften zu animieren.

Voraussetzungen

Um dieses Thema zu verstehen, sollten Sie WPF-Animationen zum Animieren von Eigenschaften verwenden können, wie in Übersicht über Animationen beschrieben. Auch Kenntnisse über Abhängigkeitseigenschaften sind hilfreich. Weitere Informationen finden Sie unter Übersicht über Abhängigkeitseigenschaften.

Zeitachsen und Uhren

In der Animationsübersicht wurde beschrieben, wie ein Timeline ein Zeitsegment darstellt, und eine Animation ist eine Art von Timeline, die Ausgabewerte erzeugt. Ein Timeline, tut an sich nichts anderes, als einen Zeitabschnitt zu beschreiben. Es ist das Clock-Objekt der Zeitleiste, das die eigentliche Arbeit leistet. Animationen animieren auch nicht wirklich Eigenschaften: Eine Animationsklasse beschreibt, wie Ausgabewerte berechnet werden sollen, aber die für die Animation erstellte Clock-Klasse treibt die Animationsausgabe an und wendet sie auf Eigenschaften an.

Clock ist eine spezielle Art von Objekt, das den zeitbezogenen Laufzeitstatus für Timeline. Sie enthält drei Informationen, die für das Animations- und Zeitsteuerungssystem wichtig sind: CurrentTime, CurrentProgress und CurrentState. Clock bestimmt seine aktuelle Zeit, den Fortschritt und den Zustand mithilfe der Anzeigedauerverhalten, die anhand folgender Elemente beschrieben werden: Timeline, Duration, RepeatBehavior, AutoReverse usw.

In den meisten Fällen wird Clock automatisch für Ihre Zeitleiste erstellt. Wenn Sie mit der Storyboard- oder der BeginAnimation-Methode animieren, werden automatisch Uhren für Ihre Zeitleisten und Animationen erstellt und auf die entsprechenden Eigenschaften angewendet. Sie können auch eine Clock explizite Erstellung mithilfe der CreateClock Methode Ihrer Timeline. Die MediaTimeline.CreateClock-Methode erstellt eine Uhr des entsprechenden Typs für das Timeline, auf dem sie aufgerufen wird. Wenn Timeline untergeordnete Zeitleisten enthält, erstellt sie auch Clock-Objekte für diese. Die resultierenden Clock-Objekte werden in Bäumen angeordnet, die der Struktur des Timeline-Objektbaums entsprechen, aus dem sie erstellt wurden.

Es gibt verschiedene Typen von Uhren für verschiedene Typen von Zeitachsen. Die folgende Tabelle zeigt die Clock-Typen, die einigen der verschiedenen Timeline-Typen entsprechen.

Zeitachsentypen Typ der Uhr Zweck der Uhr
Animation (erbt von AnimationTimeline) AnimationClock Generiert Ausgabewerte für eine Abhängigkeitseigenschaft
MediaTimeline MediaClock Verarbeitet eine Mediendatei
ParallelTimeline ClockGroup Gruppiert und kontrolliert seine untergeordneten Clock-Objekte
Storyboard ClockGroup Gruppiert und kontrolliert seine untergeordneten Clock-Objekte

Sie können alle von Ihnen erstellten AnimationClock-Objekte auf kompatible Abhängigkeitseigenschaften anwenden, indem Sie die ApplyAnimationClock-Methode verwenden.

In rechenintensiven Szenarios, z. B. Animieren einer großen Anzahl ähnlicher Objekte verwalten Ihre eigenen Clock verwenden, kann Leistungsvorteile bieten.

Uhren und der Zeit-Manager

Wenn Sie Objekte in WPF animieren, werden die für die Zeitachsen erstellten Clock-Objekte vom Zeit-Manager verwaltet. Der Zeit-Manager ist der Stamm einer Struktur von Clock Objekten und steuert den Zeitablauf in dieser Struktur. Ein Zeit-Manager wird automatisch für jede WPF-Anwendung erstellt und ist für den Anwendungsentwickler nicht sichtbar. Der Zeit-Manager „tickt“ mehrmals pro Sekunde. Die tatsächliche Anzahl von Ticks pro Sekunde variiert je nach den verfügbaren Systemressourcen. Während jedes dieser Ticks berechnet der Zeitmanager den Zustand aller ActiveClock-Objekte im Zeitbaum.

Die folgende Abbildung zeigt die Beziehung zwischen dem Zeitmanager und AnimationClock und einer animierten Abhängigkeitseigenschaft.

Timing system components and the time manager.
Animieren einer Eigenschaft

Wenn der Zeitmanager tickt, aktualisiert er die Zeit jeder ActiveClock in der Anwendung. Wenn es Clock sich um ein AnimationClock, wird die GetCurrentValue Methode verwendet, aus der AnimationTimeline sie erstellt wurde, um den aktuellen Ausgabewert zu berechnen. Die AnimationClock liefert die AnimationTimeline mit aktueller Ortszeit, einen Eingabewert, der normalerweise der Basiswert der Eigenschaft ist, und einen Standardzielwert. Wenn Sie den Wert einer „animiert von-Eigenschaft mithilfe der GetValue-Methode oder ihres CLR-Accessors abrufen, erhalten Sie die Ausgabe der AnimationClock.

Uhrgruppen

Im vorherigen Abschnitt wurden die verschiedenen Typen von Clock-Objekte für verschiedene Typen von Zeitachsen beschrieben. Die folgende Abbildung zeigt die Beziehung zwischen dem Zeitmanager und ClockGroup und AnimationClock einer animierten Abhängigkeitseigenschaft. ClockGroup wird für Zeitachsen erstellt, die andere Zeitachsen gruppieren, wie z. B. die Storyboard-Klasse, die Animationen und andere Timelines gruppiert.

Timing system components with the time manager and dependency properties.
Eine ClockGroup

Zusammensetzung

Es ist möglich, mehrere Uhren einer einzelnen Eigenschaft zuzuordnen. Jede Uhr verwendet dann den Ausgabewert der vorangehenden Uhr als Basiswert. Die folgende Abbildung zeigt drei AnimationClock-Objekte, die auf dieselbe Eigenschaft angewendet werden. Uhr1 verwendet den Basiswert der animierten Eigenschaft als Eingabe und verwendet ihn, um die Ausgabe zu generieren. Uhr2 nimmt die Ausgabe von Uhr1 als Eingabe und verwendet sie, um die Ausgabe zu generieren. Uhr3 nimmt die Ausgabe von Uhr2 als Eingabe und verwendet sie, um die Ausgabe zu generieren. Wenn mehrere Uhren gleichzeitig dieselbe Eigenschaft beeinflussen, befinden sie sich in einer Kompositionskette.

Timing system components composed with multiple dependency properties.
Eine Kompositionskette

Beachten Sie, dass zwar eine Beziehung zwischen der Eingabe und der Ausgabe der AnimationClock-Objekte in der Kompositionskette hergestellt wird, ihr zeitliches Verhalten jedoch nicht beeinflusst wird; Clock-Objekte (einschließlich AnimationClock-Objekte) haben eine hierarchische Abhängigkeit von ihren übergeordneten Clock-Objekten.

Wenn Sie mehrere Uhren auf dieselbe Eigenschaft anwenden möchten, verwenden Sie beim ComposeHandoffBehavior Anwenden einer Storyboard, Animation oder AnimationClock.

Tick- und Ereigniskonsolidierung

Zusätzlich zum Berechnen von Ausgabewerten verrichtet der Zeit-Manager andere Aufgaben bei jedem Tick: Er bestimmt den Zustand jeder Uhr und löst ggf. Ereignisse aus.

Wenn Ticks häufiger auftreten, kann zwischen den einzelnen Ticks Vieles geschehen. Beispielsweise kann eine Clock gestoppt, gestartet und wieder gestoppt werden. In diesem Fall ändert sich ihr CurrentState-Wert drei Mal. Theoretisch kann das CurrentStateInvalidated-Ereignis mehrere Male in einem Teilstrich ausgelöst werden. Die Zeitsteuerungs-Engine konsolidiert jedoch Ereignisse, damit jedes CurrentStateInvalidated-Ereignis höchstens einmal pro Teilstrich ausgelöst werden kann. Dies gilt für alle Zeitsteuerungsereignisse: Es wird maximal ein Ereignis jedes Typs für ein bestimmtes Clock-Objekt ausgelöst.

Wenn ein Clock den Zustand wechselt und zwischen den Ticks wieder in seinen ursprünglichen Status zurückkehrt (z. B. Wechsel von Active zu Stopped und zurück zu Active), tritt das zugehörige Ereignis trotzdem ein.

Weitere Informationen zu Zeitsteuerungsereignissen finden Sie unter Übersicht über Zeitsteuerungsereignisse.

Aktuelle Werte und Basiswerte von Eigenschaften

Eine animierbare Eigenschaft kann zwei Werte haben: einen Basiswert und einen aktuellen Wert. Wenn Sie eine Eigenschaft mit ihrem CLR-Accessor oder der SetValue-Methode setzen, setzen Sie ihren Basiswert. Wenn eine Eigenschaft nicht animiert ist, sind der Basiswert und der aktuelle Wert identisch.

Wenn Sie eine Eigenschaft animieren, wird AnimationClock der aktuelle Wert der Eigenschaft festgelegt. Durch Abrufen des Werts der Eigenschaft über den CLR-Accessor oder die GetValue Methode wird die Ausgabe des AnimationClock Zeitpunkts AnimationClockActive oder Fillingder Methode zurückgegeben. Sie können den Basiswert der Eigenschaft mit der GetAnimationBaseValue-Methode abrufen.

Siehe auch