Übersicht über das Animations- und Zeitsteuerungssystem
In diesem Thema wird beschrieben, wie das Zeitsteuerungssystem die Animationsklasse, die Timeline-Klasse und die Clock-Klasse verwendet, um Eigenschaften zu animieren.
Erforderliche Komponenten
Für dieses Thema sollten Sie mit der Verwendung der unter Übersicht über Animationen beschriebenen WPF-Animationen zum Animieren von Eigenschaften vertraut sein. Es ist auch hilfreich, mit Abhängigkeitseigenschaften vertraut zu sein. Weitere Informationen finden Sie unter Übersicht über Abhängigkeitseigenschaften.
Zeitachsen und Uhren
In Übersicht über Animationen wurde beschrieben, wie eine Timeline ein Zeitsegment darstellt, und dass eine Animation ein Typ einer Timeline ist, die Ausgabewerte erzeugt. Eine Timeline selbst hat lediglich die Funktion, einen bestimmten Zeitabschnitt zu beschreiben. Die eigentliche Arbeit übernimmt das Clock-Objekt der Zeitachse. Ebenso animiert eine Animation eigentlich keine Eigenschaften: Eine Animationsklasse beschreibt, wie Ausgabewerte berechnet werden sollen, aber die für die Animation erstellte Clock steuert die Animationsausgabe und wendet sie auf Eigenschaften an.
Eine Clock ist ein besonderer Objekttyp, der den zeitbezogenen Laufzeitzustand für die Timeline verwaltet. Sie bietet drei Informationen, die für das Animations- und Zeitsteuerungssystem sehr wichtig sind: CurrentTime, CurrentProgress und CurrentState. Eine Clock bestimmt die aktuelle Uhrzeit, den Fortschritt und den Zustand mithilfe des Zeitverhaltens, das von ihrer Timeline beschrieben wird: Duration, RepeatBehavior, AutoReverse usw.
In den meisten Fällen wird für die Zeitachse automatisch eine Clock erstellt. Wenn Sie Animationen mit einem Storyboard oder der BeginAnimation-Methode ausführen, werden Uhren für die Zeitachsen und Animationen automatisch erstellt und auf die Zieleigenschaften angewendet. Sie können mit der CreateClock-Methode der Timeline auch explizit eine Clock erstellen. Die MediaTimeline.CreateClock-Methode erstellt für die Timeline, für die sie aufgerufen wird, eine Uhr des entsprechenden Typs. Wenn die Timeline untergeordnete Zeitachsen enthält, erstellt sie auch für diese Clock-Objekte. Die resultierenden Clock-Objekte werden in Strukturen angeordnet, die der Struktur der Timeline-Objektstruktur, aus der sie erstellt werden, entsprechen.
Es gibt verschiedene Typen von Uhren für verschiedene Typen von Zeitachsen. In der folgenden Tabelle werden die Clock-Typen dargestellt, die einigen der verschiedenen Timeline-Typen entsprechen.
Zeitachsentyp |
Uhrtyp |
Zweck der Uhr |
---|---|---|
Animation (erbt von AnimationTimeline) |
Generiert Ausgabewerte für eine Abhängigkeitseigenschaft. |
|
Verarbeitet eine Mediendatei. |
||
Gruppiert und steuert die untergeordneten Clock-Objekte |
||
Gruppiert und steuert die untergeordneten Clock-Objekte |
Sie können alle von Ihnen erstellten AnimationClock-Objekte mithilfe der ApplyAnimationClock-Methode auf kompatible Abhängigkeitseigenschaften anwenden.
In ressourcenintensiven Szenarien, z. B. beim Animieren einer großen Anzahl ähnlicher Objekte, kann das Verwalten der eigenen Clock-Verwendung Leistungsvorteile bieten.
Uhren und 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 erfasst viele "Ticks" pro Sekunde. Wie viele Ticks tatsächlich in jeder Sekunde auftreten, variiert abhängig von den verfügbaren Systemressourcen. Während jedes einzelnen Teilstrichs berechnet der Zeit-Manager den Zustand aller Active Clock-Objekte in der Zeitstruktur.
In der folgenden Abbildung wird die Beziehung zwischen dem Zeit-Manager und AnimationClock sowie einer animierten Abhängigkeitseigenschaft veranschaulicht.
Animieren einer Eigenschaft
Bei jedem Teilstrich des Zeit-Managers aktualisiert er die Zeit von jeder Active Clock in der Anwendung. Wenn die Clock eine AnimationClock ist, wird mit der GetCurrentValue-Methode der AnimationTimeline, aus der sie erstellt wurde, der aktuelle Ausgabewert berechnet. Die AnimationClock stellt die AnimationTimeline mit der aktuellen Ortszeit, einem Eingabewert, bei dem es sich üblicherweise um den Basiswert der Eigenschaft handelt, und einem Standardzielwert bereit. Wenn Sie mit der GetValue-Methode oder dem CLR-Accessor den Wert einer animierten Eigenschaft abrufen, erhalten Sie die Ausgabe der zugehörigen AnimationClock.
ClockGroups
Im vorherigen Abschnitt wurde beschrieben, dass es verschiedene Typen von Clock-Objekten für verschiedene Typen von Zeitachsen gibt. In der folgenden Abbildung wird die Beziehung zwischen dem Zeit-Manager, einer ClockGroup, einer AnimationClock und einer animierten Abhängigkeitseigenschaft veranschaulicht. Es wird eine ClockGroup für Zeitachsen erstellt, die andere Zeitachsen gruppieren, z. B. die Storyboard-Klasse, die Animationen und andere Zeitachsen gruppiert.
Eine ClockGroup
Komposition
Es ist möglich, einer einzelnen Eigenschaft mehrere Uhren zuzuordnen. In diesem Fall verwendet jede Uhr den Ausgabewert der vorherigen Uhr als Basiswert. In der folgenden Abbildung werden drei AnimationClock-Objekte dargestellt, die auf dieselbe Eigenschaft angewendet werden. Clock1 verwendet den Basiswert der animierten Eigenschaft als Eingabe und verwendet diese wiederum zum Generieren einer Ausgabe. Clock2 verwendet die Ausgabe von Clock1 als Eingabe und verwendet diese wiederum zum Generieren einer Ausgabe. Clock3 verwendet die Ausgabe von Clock2 als Eingabe und verwendet diese wiederum zum Generieren einer Ausgabe. Wenn mehrere Uhren gleichzeitig dieselbe Eigenschaft beeinflussen, werden sie als Kompositionskette bezeichnet.
Eine Kompositionskette
Beachten Sie, dass, obwohl zwischen Ein- und Ausgabe der AnimationClock-Objekte in der Kompositionskette eine Beziehung erstellt wird, ihr Zeitverhalten nicht beeinflusst wird. Clock-Objekte (einschließlich AnimationClock-Objekten) besitzen eine hierarchische Abhängigkeit von ihren übergeordneten Clock-Objekten.
Um mehrere Uhren auf dieselbe Eigenschaft anzuwenden, verwenden Sie Compose HandoffBehavior, wenn Sie ein Storyboard, eine Animation oder eine AnimationClock anwenden.
Teilstriche und Ereigniskonsolidierung
Zusätzlich zum Berechnen von Ausgabewerten erledigt der Zeit-Manager bei jedem Teilstrich noch weitere Aufgaben: Er bestimmt den Zustand jeder Uhr und löst ggf. Ereignisse aus.
Teilstriche treten häufig auf, und es können viele Dinge zwischen einzelnen Teilstrichen geschehen. Beispielsweise kann eine Clock angehalten, gestartet und wieder angehalten werden. Dabei hätte sich der CurrentState-Wert insgesamt dreimal geändert. Theoretisch kann das CurrentStateInvalidated-Ereignis für einen einzelnen Teilstrich mehrere Male ausgelöst werden. Das Zeitgebermodul konsolidiert jedoch Ereignisse, sodass das CurrentStateInvalidated-Ereignis höchstens einmal pro Teilstrich ausgelöst werden kann. Dies gilt für alle Zeitsteuerungsereignisse: Maximal ein Ereignis von jedem Typ wird für ein bestimmtes Clock-Objekt ausgelöst.
Wenn eine Clock die Zustände wechselt und zwischen den Teilstrichen zum ursprünglichen Zustand zurückkehrt (z. B. beim Wechsel von Active zu Stopped und zurück zu Active), tritt das zugeordnete Ereignis weiterhin auf.
Weitere Informationen zu Zeitsteuerungsereignissen finden Sie unter Übersicht über Zeitsteuerungsereignisse.
Aktuelle Werte und Basiswerte von Eigenschaften
Eine animierbare Eigenschaft kann zwei Werte besitzen: einen Basiswert und einen aktuellen Wert. Wenn Sie die Eigenschaft mit dem CLR-Accessor oder der SetValue-Methode festlegen, legen Sie den Basiswert fest. Bei einer nicht animierten Eigenschaft sind Basiswert und aktueller Wert gleich.
Wenn Sie eine Eigenschaft animieren, legt AnimationClock den aktuellen Wert der Eigenschaft fest. Beim Abrufen des Eigenschaftswerts mit dem CLR-Accessor oder der GetValue-Methode wird die Ausgabe von AnimationClock zurückgegeben, wenn AnimationClock den Wert Active oder Filling aufweist. Sie können den Basiswert der Eigenschaft mit der GetAnimationBaseValue-Methode abrufen.