Freigeben über


Übersicht über das Animations- und Timing-System

In diesem Thema wird beschrieben, wie das Timing-System die Animation und TimelineClock Klassen zum Animieren von Eigenschaften verwendet.

Voraussetzungen

Um dieses Thema zu verstehen, sollten Sie WPF-Animationen verwenden können, um Eigenschaften zu animieren, wie in der Animationsübersicht beschrieben. Es hilft auch, mit Abhängigkeitseigenschaften vertraut zu sein; weitere Informationen finden Sie in der Übersicht über Abhängigkeitseigenschaften.

Zeitachsen und Uhren

In der Animationsübersicht wird beschrieben, wie ein Timeline Teil der Zeit darstellt, und eine Animation ist ein Typ, der Timeline Ausgabewerte erzeugt. Allein ein Timeline, macht nichts anderes als nur ein Segment der Zeit zu beschreiben. Es ist das Objekt der Zeitachse Clock , das die eigentliche Arbeit erledigt. Ebenso animiert die Animation keine Eigenschaften: Eine Animationsklasse beschreibt, wie Ausgabewerte berechnet werden sollen. Es ist jedoch Clock, das für die Animation erstellt wurde, das die Animationsausgabe steuert und sie auf Eigenschaften anwendet.

A Clock ist ein spezieller Objekttyp, der den zeitbezogenen Laufzeitzustand für das Timeline verwaltet. Es stellt drei Bits von Informationen bereit, die für das Animations- und Timing-System von wesentlicher Bedeutung sind: CurrentTime, , CurrentProgressund CurrentState. A Clock bestimmt die aktuelle Zeit, den Fortschritt und den Zustand mithilfe der durch seinen Timeline beschriebenen Zeitverhalten: Duration, RepeatBehavior, AutoReverse und so weiter.

In den meisten Fällen wird eine Clock automatisch für Ihre Timeline erstellt. Wenn Sie mithilfe einer Storyboard oder der BeginAnimation Methode animieren, werden Uhren automatisch für Ihre Zeitachsen und Animationen erstellt und auf ihre zielbezogenen Eigenschaften angewendet. Sie können auch eine Clock explizit erstellen, indem Sie die CreateClock Methode Ihrer Timeline verwenden. Die MediaTimeline.CreateClock-Methode erzeugt eine Uhr des entsprechenden Typs für den Timeline, auf dem sie aufgerufen wird. Wenn die Timeline untergeordnete Zeitachsen enthält, erzeugt es auch Clock-Objekte für diese. Die resultierenden Clock Objekte werden in Baumstrukturen angeordnet, die der Struktur des Timeline Objektenbaums entsprechen, aus dem sie erstellt werden.

Es gibt verschiedene Arten von Uhren für unterschiedliche Zeitrahmen. In der folgenden Tabelle sind die Clock Typen aufgeführt, die einigen der verschiedenen Timeline Typen entsprechen.

Zeitachsentyp Uhrtyp Uhrzweck
Animation (erbt von AnimationTimeline) AnimationClock Generiert Ausgabewerte für eine Abhängigkeitseigenschaft.
MediaTimeline MediaClock Verarbeitet eine Mediendatei.
ParallelTimeline ClockGroup Gruppiert und steuert seine untergeordneten Clock Objekte
Storyboard ClockGroup Gruppiert und steuert seine untergeordneten Clock Objekte

Sie können alle AnimationClock Objekte anwenden, die Sie mithilfe der ApplyAnimationClock Methode auf kompatible Abhängigkeitseigenschaften erstellen.

In leistungsintensiven Szenarien, z. B. das Animieren einer großen Anzahl ähnlicher Objekte, kann die Verwaltung Ihrer eigenen Clock Verwendung Leistungsvorteile bieten.

Uhren und der Zeit-Manager

Wenn Sie Objekte in WPF animieren, ist es der Zeitmanager, der die Clock für Ihre Zeitachsen erstellten Objekte verwaltet. Der Zeit-Manager ist der Stamm einer Struktur von Clock Objekten und steuert den Zeitfluss in dieser Struktur. Ein Zeit-Manager wird automatisch für jede WPF-Anwendung erstellt und ist für den Anwendungsentwickler unsichtbar. Der Zeitmanager "tickt" viele Male pro Sekunde; die tatsächliche Anzahl der Taktzyklen, die pro Sekunde auftreten, variiert je nach verfügbaren Systemressourcen. Während jeder dieser Ticks berechnet der Zeit-Manager den Zustand aller ActiveClock Objekte im Timing-Baum.

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

Komponenten des Timing-Systems und der Zeit-Manager.
Animieren einer Eigenschaft

Wenn der Zeit-Manager tickt, aktualisiert er die Uhrzeit jeder ActiveClock in der Anwendung. Wenn das Clock ein AnimationClock ist, verwendet es die GetCurrentValue-Methode der AnimationTimeline, von der es erstellt wurde, um seinen aktuellen Ausgabewert zu berechnen. Die AnimationClock Liefert die AnimationTimeline aktuelle Ortszeit, einen Eingabewert, der in der Regel den Basiswert der Eigenschaft und einen Standardzielwert darstellt. Wenn Sie den Wert einer animierten Eigenschaft mithilfe der GetValue Methode oder des CLR-Accessors abrufen, erhalten Sie die Ausgabe der Eigenschaft AnimationClock.

Uhrgruppen

Im vorherigen Abschnitt wird beschrieben, wie verschiedene Objekttypen Clock für verschiedene Zeitachsentypen vorhanden sind. Die folgende Abbildung zeigt die Beziehung zwischen dem Zeit-Manager, einem ClockGroup, einem AnimationClockund einer animierten Abhängigkeitseigenschaft. A ClockGroup wird für Zeitachsen erstellt, die andere Zeitachsen gruppieren, z. B. die Storyboard Klasse, die Animationen und andere Zeitachsen gruppiert.

Timing-Systemkomponenten mit dem Zeit-Manager und abhängigkeitseigenschaften.
Eine ClockGroup

Zusammensetzung

Es ist möglich, mehrere Uhren einer einzelnen Eigenschaft zuzuordnen, in diesem Fall verwendet jede Uhr den Ausgabewert der vorherigen Uhr als Basiswert. Die folgende Abbildung zeigt drei AnimationClock Objekte, die auf dieselbe Eigenschaft angewendet werden. Clock1 verwendet den Basiswert der animierten Eigenschaft als Eingabe und verwendet ihn zum Generieren der Ausgabe. Clock2 verwendet die Ausgabe von Clock1 als Eingabe und verwendet sie zum Generieren der Ausgabe. Clock3 verwendet die Ausgabe von Clock2 als Eingabe und verwendet sie zum Generieren der Ausgabe. Wenn sich mehrere Uhren gleichzeitig auf dieselbe Eigenschaft auswirken, werden sie als Kompositionskette bezeichnet.

Timing-Systemkomponenten, die mit mehreren Abhängigkeitseigenschaften zusammengesetzt sind.
Eine Kompositionskette

Beachten Sie, dass, obwohl eine Beziehung zwischen den Eingaben und Ausgaben der AnimationClock Objekte in der Kompositionskette erstellt wird, deren Zeitverhalten jedoch nicht betroffen ist. 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 StoryboardAnimation oder einer AnimationClockAnimation .

Zecken und Ereigniskonsolidierung

Neben der Berechnung von Ausgabewerten führt der Zeitmanager jedes Mal andere Arbeiten durch: Er bestimmt den Zustand jeder Uhr und löst entsprechend Ereignisse aus.

Während Ticks häufig auftreten, ist es möglich, dass viele Dinge zwischen Zecken passieren. Beispielsweise kann ein Clock angehalten, gestartet und wieder angehalten werden, wobei sich dessen CurrentState-Wert dreimal geändert hat. Theoretisch könnte das CurrentStateInvalidated Ereignis in einem einzigen Tick mehrmals ausgelöst werden; das Timingmodul konsolidiert jedoch die Ereignisse, sodass das CurrentStateInvalidated Ereignis höchstens einmal pro Tick ausgelöst werden kann. Dies gilt für alle Zeitereignisse: Für ein bestimmtes Clock Objekt wird höchstens ein Ereignis jedes Typs ausgelöst.

Wenn ein Clock zwischen Zuständen wechselt und in sein ursprüngliches Zustand zwischen den Takten zurückkehrt (z.B. von Active zu Stopped und zurück zu Active), tritt das zugehörige Ereignis trotzdem auf.

Weitere Informationen zu den Zeitsteuerungsereignissen finden Sie in der Übersicht über Timing-Ereignisse.

Aktuelle Werte und Basiswerte von Eigenschaften

Eine animierbare Eigenschaft kann zwei Werte aufweisen: einen Basiswert und einen aktuellen Wert. Wenn Sie die Eigenschaft mithilfe des CLR-Accessors oder der SetValue Methode festlegen, legen Sie den Basiswert fest. Wenn eine Eigenschaft nicht animiert wird, sind die Basis- und aktuellen Werte identisch.

Wenn Sie eine Eigenschaft animieren, wird der AnimationClockaktuelle Wert der Eigenschaft festgelegt. Beim Abrufen des Werts der Eigenschaft über den CLR-Accessor oder die GetValue-Methode wird die Ausgabe von AnimationClock zurückgegeben, wenn AnimationClock entweder Active oder Filling ist. Sie können den Basiswert der Eigenschaft mithilfe der GetAnimationBaseValue Methode abrufen.

Siehe auch