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, die Key-Frame Animationen Übersichtund die Path Animationen Übersicht.

Da die Animationsklassen von der Freezable-Klasse erben, sollten Sie mit Freezable-Objekten vertraut sein und wie man von Freezableerbt. Weitere Informationen finden Sie in der Übersicht über Freezable-Objekte.

Erweiterung 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 Key-Frame-Objekt, indem Sie von einer der *<Type>*KeyFrame-Klassen, wie zum Beispiel DoubleKeyFrame, erben. 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 einen Per-Frame-Callback, 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.
Die Interpolation zwischen Werten eines Typs anpassen, der mit einer entsprechenden *<Typ>*AnimationUsingKeyFrames korrespondiert. 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 einen entsprechenden *<Typ>*Animation aufweisen. 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 eine ObjectAnimationUsingKeyFrames, oder erstellen Sie eine Klasse, die von AnimationTimelineerbt. 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 einen Rückruf für jedes Frame. Weitere Informationen finden Sie im Abschnitt Erstellen eines Use Per-Frame Callback Abschnitt.

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 Keyframe-Animation verwenden möchten. Wie in der Key-Frame Animationsübersichtbeschrieben, verwendet eine Schlüsselbildanimation Schlüsselbildobjekte, um die Ausgabewerte zu generieren. Jedes Keyframeobjekt führt drei Funktionen aus:

  • Gibt einen Zielwert mithilfe der 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 ab von der abstrakten Klasse *<Type>*KeyFrame 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 *<Typ>*Keyframeklassen von der Freezable Klasse erben, müssen Sie auch die CreateInstanceCore-core-Funktion überschreiben, um eine neue Instanz Ihrer Klasse zurückzugeben. Wenn die Klasse keine Abhängigkeitseigenschaften zum Speichern ihrer Daten verwendet oder nach der Erstellung eine zusätzliche Initialisierung erfordert, müssen Sie möglicherweise weitere Methoden überschreiben. Weitere Informationen finden Sie in der Übersicht über Objekte, die eingefroren werden können.

Nachdem Sie Ihre benutzerdefinierte *<Typ>*Keyframe-Animation erstellt haben, können Sie sie mit der *<Typ>*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 eines 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 der *<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, der 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 Klassen *<Typ>*AnimationBase erben von der Freezable Klasse, müssen Sie auch CreateInstanceCore Kern 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 eine zusätzliche Initialisierung erfordert, müssen Sie möglicherweise zusätzliche Methoden überschreiben; weitere Informationen finden Sie in der Übersicht über freizierbare Objekte.

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 benutzerdefinierten Animationsbeispiel

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 dem entsprechenden *<Type>*AnimationUsingKeyFrames verwendet werden, die von WPF bereitgestellt werden.

Ableiten von AnimationTimeline

Leiten Sie die Klasse AnimationTimeline ab, wenn Sie eine Animation für einen Typ erstellen möchten, der noch nicht über eine entsprechende WPF-Animation verfügt, oder wenn Sie eine Animation erstellen möchten, die nicht stark typisiert ist.

Implementierungsanweisungen

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

  • CreateInstanceCore – Wenn Ihre neue Klasse konkret ist, müssen Sie CreateInstanceCore überschreiben, 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 aktuellen Fortschritt für die 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 Standard-Zielwert verwendet, der von der GetCurrentValue Methode angegeben wird.

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

Wenn die Klasse keine Abhängigkeitseigenschaften zum Speichern ihrer Daten verwendet oder eine zusätzliche Initialisierung nach der Erstellung erfordert, müssen Sie möglicherweise noch weitere Methoden überschreiben. Weitere Informationen finden Sie im Übersicht über freizierbare Objekte.

Das empfohlene Paradigma, das bei WPF-Animationen verwendet wird, besteht darin, zwei Vererbungsebenen zu verwenden.

  1. Erstellen Sie eine abstrakte *<Type>*AnimationBase-Klasse, die von AnimationTimelineabgeleitet wird. Diese Klasse sollte die Methode TargetPropertyType überschreiben. Es sollte auch eine neue abstrakte Methode, GetCurrentValueCore, einführen und die Methode GetCurrentValue überschreiben, sodass sie die Typen der Standardursprungswert- und Standardzielwertparameter überprüft und dann GetCurrentValueCore aufruft.

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

Alternative Ansätze

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

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 die Physikanimation, bei der bei jedem Animationsschritt eine neue Richtung oder Position der animierten Objekte basierend auf der letzten Menge von Objektinteraktionen neu berechnet werden muss.

Implementierungsanweisungen

Im Gegensatz zu den anderen in dieser Übersicht beschriebenen Ansätzen müssen Sie, um pro Frame einen Callback zu verwenden, keine benutzerdefinierte Animations- oder Keyframe-Klasse 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 in der visuellen Struktur in die Kompositionsstruktur einfügt, 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 Darstellungszeit des aktuellen Frames abzurufen, kann die EventArgs, die diesem Ereignis zugeordnet ist, als RenderingEventArgsumgewandelt werden, wodurch eine Eigenschaft RenderingTime bereitgestellt wird, die Sie verwenden können, um die Renderzeit des aktuellen Frames abzurufen.

Weitere Informationen finden Sie auf der Rendering-Seite.

Siehe auch