Freigeben über


Übersicht über benutzerdefinierte Animationen

In diesem Thema wird beschrieben, wie und wann das WPF-Animationssystem durch Erstellen von benutzerdefinierten Keyframes, Animationsklassen oder mithilfe eines Framerückrufs erweitert wird, um es zu umgehen.

Voraussetzungen

Um dieses Thema zu verstehen, sollten Sie mit den verschiedenen Arten von Animationen vertraut sein, die vom WPF bereitgestellt werden. Weitere Informationen finden Sie in der Übersicht über From/To/By-Animationen, in der Übersicht überKey-Frame Animationen und in der Übersicht über Pfadanimationen.

Da die Animationsklassen von der Freezable Klasse erben, sollten Sie mit Freezable Objekten und dem Erben von FreezableObjekten vertraut sein. Weitere Informationen finden Sie in der Übersicht über Freezable Objects.

Erweitern des Animationssystems

Es gibt eine Reihe von Möglichkeiten zum Erweitern des WPF-Animationssystems, abhängig von der Ebene der integrierten Funktionalität, die Sie verwenden möchten. Im WPF-Animationsmodul gibt es drei primäre Erweiterbarkeitspunkte:

  • Erstellen Sie ein benutzerdefiniertes Keyframeobjekt, indem Sie von einer der *<Type>*KeyFrame-Klassen erben, z. B. DoubleKeyFrame. Dieser Ansatz verwendet die meisten integrierten Funktionen des WPF-Animationsmoduls.

  • Erstellen Sie ihre eigene Animationsklasse, indem Sie von AnimationTimeline oder einer der *<Type>*AnimationBase-Klassen erben.

  • Verwenden Sie den Rahmenrückruf, um Animationen pro Frame zu generieren. Bei diesem Ansatz wird das Animations- und Timing-System vollständig umgangen.

In der folgenden Tabelle werden einige Szenarien zum Erweitern des Animationssystems beschrieben.

Wenn Sie möchten... Verwenden Sie diesen Ansatz.
Anpassen der Interpolation zwischen Werten eines Typs, der zu einer passenden *<Type>*AnimationUsingKeyFrames gehört. Erstellen Sie einen benutzerdefinierten Keyframe. Weitere Informationen finden Sie im Abschnitt "Erstellen eines benutzerdefinierten Keyframes ".
Passen Sie mehr als nur die Interpolation zwischen Werten eines Typs an, die über eine entsprechende *<Type>*Animation verfügen. Erstellen Sie eine benutzerdefinierte Animationsklasse, die von der *<Type>*AnimationBase-Klasse erbt, die dem Typ entspricht, den Sie animieren möchten. Weitere Informationen finden Sie im Abschnitt "Erstellen einer benutzerdefinierten Animationsklasse ".
Animieren eines Typs ohne entsprechende WPF-Animation Verwenden Sie ein ObjectAnimationUsingKeyFrames oder erstellen Sie eine Klasse, die von AnimationTimeline erbt. Weitere Informationen finden Sie im Abschnitt "Erstellen einer benutzerdefinierten Animationsklasse ".
Animieren mehrerer Objekte mit Werten, die für jeden Frame berechnet werden und auf dem letzten Satz von Objektinteraktionen basieren Verwenden Sie den Rückruf pro Frame. Weitere Informationen finden Sie im Abschnitt Erstellen eines Use Per-Frame-Callbacks.

Erstellen eines benutzerdefinierten Keyframes

Das Erstellen einer benutzerdefinierten Keyframeklasse ist die einfachste Möglichkeit, das Animationssystem zu erweitern. Verwenden Sie diesen Ansatz, wenn Sie eine andere Interpolationsmethode für eine Keyframeanimation verwenden möchten. Wie in der Übersicht überKey-Frame Animationen beschrieben, verwendet eine Keyframeanimation Keyframeobjekte, um die Ausgabewerte zu generieren. Jedes Keyframeobjekt führt drei Funktionen aus:

  • Gibt einen Zielwert mithilfe seiner Value Eigenschaft an.

  • Gibt den Zeitpunkt an, zu dem dieser Wert mithilfe seiner KeyTime Eigenschaft erreicht werden soll.

  • Interpoliert zwischen dem Wert des vorherigen Keyframes und seinem eigenen Wert, indem die InterpolateValueCore-Methode implementiert wird.

Implementierungsanweisungen

Leiten Sie von der abstrakten *<Type>*KeyFrame-Klasse ab und implementieren Sie die InterpolateValueCore-Methode. Die InterpolateValueCore-Methode gibt den aktuellen Wert des Keyframes zurück. Es werden zwei Parameter benötigt: der Wert des vorherigen Keyframes und ein Fortschrittswert, der zwischen 0 und 1 liegt. Ein Fortschritt von 0 gibt an, dass der Keyframe gerade gestartet wurde, und ein Wert von 1 gibt an, dass der Keyframe gerade abgeschlossen wurde und den durch seine Value Eigenschaft angegebenen Wert zurückgeben soll.

Da die *<Type>*KeyFrame-Klassen von der Freezable Klasse erben, müssen Sie auch den Kern außer Kraft setzen CreateInstanceCore , um eine neue Instanz Ihrer Klasse zurückzugeben. Wenn die Klasse keine Abhängigkeitseigenschaften zum Speichern ihrer Daten verwendet oder nach der Erstellung zusätzliche Initialisierung erfordert, müssen Sie möglicherweise zusätzliche Methoden außer Kraft setzen. weitere Informationen finden Sie in der Übersicht über Freezable Objects .

Nachdem Sie Ihre benutzerdefinierte *<Type>*Keyframeanimation erstellt haben, können Sie sie mit den *<Type>*AnimationUsingKeyFrames für diesen Typ verwenden.

Erstellen einer benutzerdefinierten Animationsklasse

Durch das Erstellen eines eigenen Animationstyps können Sie besser steuern, wie ein Objekt animiert wird. Es gibt zwei empfohlene Methoden zum Erstellen Ihres eigenen Animationstyps: Sie können von der AnimationTimeline Klasse oder der *<Type>*AnimationBase-Klasse abgeleitet werden. Die Ableitung von den Klassen *<Type>*Animation oder *<Type>*AnimationUsingKeyFrames wird nicht empfohlen.

Abgeleitet von <Type>AnimationBase

Die Ableitung von einer *<Type>*AnimationBase-Klasse ist die einfachste Methode zum Erstellen eines neuen Animationstyps. Verwenden Sie diesen Ansatz, wenn Sie eine neue Animation für den Typ erstellen möchten, die bereits über eine entsprechende *<Type>*AnimationBase-Klasse verfügt.

Implementierungsanweisungen

Leiten Sie von einer *<Type>*Animation-Klasse ab und implementieren Sie die GetCurrentValueCore-Methode. Die GetCurrentValueCore-Methode gibt den aktuellen Wert der Animation zurück. Es werden drei Parameter verwendet: ein vorgeschlagener Anfangswert, ein vorgeschlagener Endwert und ein AnimationClock, mit dem Sie den Fortschritt der Animation bestimmen.

Da die *<Type>*AnimationBase-Klassen von der Freezable Klasse erben, müssen Sie auch den CreateInstanceCore Core außer Kraft setzen, um eine neue Instanz Ihrer Klasse zurückzugeben. Wenn die Klasse keine Abhängigkeitseigenschaften zum Speichern ihrer Daten verwendet oder nach der Erstellung zusätzliche Initialisierung erfordert, müssen Sie möglicherweise zusätzliche Methoden außer Kraft setzen. weitere Informationen finden Sie in der Übersicht über Freezable Objects .

Weitere Informationen finden Sie in der Dokumentation zur GetCurrentValueCore-Methode für die *<Type>*AnimationBase-Klasse für den Typ, den Sie animieren möchten. Ein Beispiel finden Sie im Beispiel für benutzerdefinierte Animationen

Alternative Ansätze

Wenn Sie einfach ändern möchten, wie Animationswerte interpoliert werden, sollten Sie die Ableitung von einer der *<Type>*KeyFrame-Klassen in Erwägung ziehen. Der von Ihnen erstellte Keyframe kann mit den entsprechenden *<Type>*AnimationUsingKeyFrames verwendet werden, die von WPF bereitgestellt werden.

Abgeleitet von AnimationTimeline

Leiten Sie von der Klasse AnimationTimeline ab, wenn Sie eine Animation für einen Typ erstellen möchten, der noch keine passende WPF-Animation hat, oder wenn Sie eine nicht streng typisierte Animation erstellen möchten.

Implementierungsanweisungen

Leiten Sie von der AnimationTimeline-Klasse ab und überschreiben Sie die folgenden Mitglieder.

  • CreateInstanceCore – Wenn Ihre neue Klasse konkret ist, müssen Sie außer Kraft setzen CreateInstanceCore , um eine neue Instanz Ihrer Klasse zurückzugeben.

  • GetCurrentValue – Überschreiben Sie diese Methode, um den aktuellen Wert Ihrer Animation zurückzugeben. Es werden drei Parameter verwendet: ein Standardursprungwert, ein Standardzielwert und ein AnimationClock. Verwenden Sie AnimationClock, um die aktuelle Zeit oder den Fortschritt der Animation abzurufen. Sie können auswählen, ob die Standardursprung- und Zielwerte verwendet werden sollen.

  • IsDestinationDefault – Überschreiben Sie diese Eigenschaft, um anzugeben, ob ihre Animation den von der GetCurrentValue Methode angegebenen Standardzielwert verwendet.

  • TargetPropertyType – Überschreiben Sie diese Eigenschaft, um die Type Ausgabe Ihrer Animation anzugeben.

Wenn die Klasse keine Abhängigkeitseigenschaften zum Speichern ihrer Daten verwendet oder nach der Erstellung zusätzliche Initialisierung erfordert, müssen Sie möglicherweise zusätzliche Methoden außer Kraft setzen. weitere Informationen finden Sie in der Übersicht über Freezable Objects .

Das empfohlene Paradigma (verwendet von WPF-Animationen) besteht darin, zwei Vererbungsebenen zu verwenden:

  1. Erstellen Sie eine abstrakte Klasse *<Type>*AnimationBase, die von AnimationTimeline abgeleitet wird. Diese Klasse sollte die TargetPropertyType Methode überschreiben. Außerdem sollte eine neue abstrakte Methode, GetCurrentValueCore, eingeführt werden und GetCurrentValue überschrieben werden, damit die Typen der Standardherkunftswert- und Standardzielwertparameter überprüft werden und dann GetCurrentValueCore aufgerufen wird.

  2. Erstellen Sie eine weitere Klasse, die von der neuen *<Type>*AnimationBase-Klasse erbt, und überschreibt die CreateInstanceCore Methode, die von Ihnen eingeführte GetCurrentValueCore-Methode und die IsDestinationDefault Eigenschaft.

Alternative Ansätze

Wenn Sie einen Typ animieren möchten, der keine entsprechende From/To/By-Animation oder Schlüsselbildanimation aufweist, sollten Sie eine ObjectAnimationUsingKeyFrames. Da sie schwach typiert ist, kann ein ObjectAnimationUsingKeyFrames beliebiger Werttyp animiert werden. Der Nachteil dieses Ansatzes ist, dass ObjectAnimationUsingKeyFrames nur diskrete Interpolation unterstützt wird.

Per-Frame Rückruf verwenden

Verwenden Sie diesen Ansatz, wenn Sie das WPF-Animationssystem vollständig umgehen müssen. Ein Szenario für diesen Ansatz ist Physikanimationen, bei denen bei jedem Animationsschritt eine neue Richtung oder Position animierter Objekte basierend auf der letzten Gruppe von Objektinteraktionen neu kompiliert werden muss.

Implementierungsanweisungen

Im Gegensatz zu den anderen in dieser Übersicht beschriebenen Ansätzen müssen Sie für die Verwendung eines Rückrufs pro Frame keine benutzerdefinierte Animations- oder Keyframeklasse erstellen.

Stattdessen registrieren Sie sich für das Rendering Ereignis des Objekts, das die Objekte enthält, die Sie animieren möchten. Diese Ereignishandlermethode wird einmal pro Frame aufgerufen. Jedes Mal, wenn WPF die gespeicherten Renderingdaten im visuellen Baum in den Kompositionsbaum marshallt, wird Ihre Ereignishandlermethode aufgerufen.

Führen Sie im Ereignishandler die für den Animationseffekt erforderlichen Berechnungen aus, und legen Sie die Eigenschaften der Objekte fest, die Sie mit diesen Werten animieren möchten.

Um die Präsentationszeit des aktuellen Frames abzurufen, kann das mit diesem Ereignis verknüpfte EventArgs als RenderingEventArgs umgewandelt werden, wodurch eine RenderingTime Eigenschaft zur Verfügung gestellt wird, die Sie zum Abrufen der Rendering-Zeit des aktuellen Frames verwenden können.

Weitere Informationen finden Sie auf der Rendering Seite.

Siehe auch