Übersicht über benutzerdefinierte Animationen

In diesem Thema wird beschrieben, wie und wann das WPF-Animationssystem durch Erstellen benutzerdefinierter Keyframes oder Animationsklassen erweitert oder durch Pro-Frame-Rückrufe umgangen wird.

Voraussetzungen

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

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

Erweitern des Animationssystems

Es gibt zahlreiche Methoden zum Erweitern des WPF-Animationssystems, abhängig von der Ebene der integrierten Funktionen, die Sie verwenden möchten. Es gibt drei primäre Erweiterungspunkte in der WPF-Animations-Engine:

  • Erstellen Sie ein benutzerdefiniertes Keyframe-Objekt, indem Sie von einer der *<Typ>*KeyFrame-Klassen erben, wie z. B. DoubleKeyFrame. Dieser Ansatz verwendet die meisten der integrierten Funktionen der WPF-Animations-Engine.

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

  • Verwenden Sie Pro-Frame-Rückruf, um Animationen auf einer Pro-Frame-Basis zu generieren. Bei diesem Ansatz werden die Animations- und Zeitsteuerungssysteme vollständig umgangen.

In der folgenden Tabelle werden einige die Szenarios zur Erweiterung des Animationssystems beschrieben.

Aktion Vorgehensweise
Anpassen der Interpolation zwischen Werten eines Typs mit einer entsprechenden <Typ>*AnimationUsingKeyFrames Erstellen Sie ein benutzerdefiniertes Keyframe. Weitere Informationen finden Sie im Abschnitt Erstellen eines benutzerdefinierten Keyframe.
Anpassen von mehr als einer Interpolation zwischen Werten eines Typs mit einer entsprechenden <Typ>*Animation Erstellen Sie eine benutzerdefinierte Animationsklasse, die von der <Typ>*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, der keine entsprechende WPF-Animation besitzt Verwenden Sie eine oder erstellen Sie eine ObjectAnimationUsingKeyFrames-Klasse, die von AnimationTimeline erbt. Weitere Informationen finden Sie im Abschnitt Erstellen einer benutzerdefinierten Animationsklasse.
Animieren mehrerer Objekte mit Werten, die pro Frame berechnet werden und auf dem letzten Satz von Objektinteraktionen basieren Verwenden Sie einen Pro-Frame-Rückruf. Weitere Informationen finden Sie im Abschnitt Verwenden eines Pro-Frame-Rückrufs.

Erstellen eines benutzerdefinierten Keyframes

Die einfachste Möglichkeit zum Erweitern des Animationssystems ist das Erstellen einer benutzerdefinierten Keyframe-Klasse. Verwenden Sie diesen Ansatz, wenn Sie eine andere Interpolationsmethode für eine Keyframe-Animation möchten. Wie in Übersicht über Keyframe-Animationen beschrieben ist, verwendet eine Keyframe-Animation Keyframe-Objekte, um die Ausgabewerte zu generieren. Jedes Keyframe-Objekt hat drei Funktionen:

  • Gibt einen Zielwert über seine Value-Eigenschaft an.

  • Legt den Zeitpunkt fest, zu dem dieser Wert mit seiner KeyTime-Eigenschaft erreicht werden soll.

  • Interpoliert zwischen dem Wert des vorherigen Keyframes und dem eigenen Wert durch Implementieren der InterpolateValueCore-Methode.

Implementierungsanweisungen

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

Da die *<Typ>*KeyFrame-Klassen von der Freezable-Klasse erben, 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 von Daten nutzt oder nach der Erstellung eine zusätzliche Initialisierung erfordert, müssen Sie möglicherweise zusätzliche Methoden überschreiben. Weitere Informationen finden Sie unter Übersicht über Freezable-Objekte.

Nach der Erstellung von benutzerdefinierten *<Typ>*KeyFrame-Animationen können Sie sie mit den *<Typ>*AnimationUsingKeyFrames für diesen Typ verwenden.

Erstellen einer benutzerdefinierten Animationsklasse

Beim Erstellen Ihres eigenen Animationstyps können Sie besser steuern, wie ein Objekt animiert wird. Es gibt zwei empfohlene Methoden zum Erstellen von eigenen Animationstypen: Sie können von der AnimationTimeline-Klasse oder der *<Typ>AnimationBase-Klasse ableiten. Das Ableiten von der <Typ>Animation- oder der <Typ>*AnimationUsingKeyFrames-Klasse wird nicht empfohlen.

Ableiten von <Typ >AnimationBase

Das Ableiten von einer *<Typ>*AnimationBase-Klasse ist die einfachste Möglichkeit zum Erstellen eines neuen Animationstyps. Verwenden Sie diesen Ansatz, wenn Sie eine neue Animation für einen Typ erstellen, der bereits über eine entsprechende *<Typ>AnimationBase-Klasse verfügt.

Implementierungsanweisungen

Leiten Sie von einer *<Typ>*Animation-Klasse ab und implementieren Sie die GetCurrentValueCore-Methode. Die GetCurrentValueCore-Methode gibt den aktuellen Wert der Animation zurück. Es werden drei Parameter übernommen: Ein vorgeschlagener Anfangswert, ein vorgeschlagener Endwert und eine AnimationClock, die Sie verwenden, um den Fortschritt der Animation zu bestimmen.

Da die *<Typ>*AnimationBase-Klassen von der Freezable-Klasse erben, müssen Sie auch CreateInstanceCore-Kern überschreiben, um eine neue Instanz Ihrer Klasse zurückzugeben. Wenn die Klasse keine Abhängigkeitseigenschaften zum Speichern von Daten nutzt oder nach der Erstellung eine zusätzliche Initialisierung erfordert, müssen Sie möglicherweise zusätzliche Methoden überschreiben. Weitere Informationen finden Sie unter Übersicht über Freezable-Objekte.

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

Alternative Ansätze

Wenn Sie lediglich die Art der Interpolation von Animationswerten ändern möchten, kommt eine Ableitung von einer der *<Typ>*KeyFrame-Klassen infrage. Der von Ihnen erstellte Keyframe kann mit den entsprechenden <Typ>*AnimationUsingKeyFrames verwendet werden, die von WPF bereitgestellt werden.

Ableiten von AnimationTimeline

Leiten Sie von der AnimationTimeline-Klasse ab, wenn Sie eine Animation für einen Typ erstellen, 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 Member:

  • 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. Sie benötigt drei Parameter: einen Standardherkunftswert, einen Standardzielwert und einen AnimationClock. Verwenden Sie die AnimationClock, um die aktuelle Zeit oder den Fortschritt der Animation zu erhalten. Sie können auswählen, ob die Standardursprungs- oder zielwerte verwendet werden.

  • 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 der Ausgabe anzugeben, die Ihre Animation erzeugt.

Wenn die Klasse keine Abhängigkeitseigenschaften zum Speichern von Daten nutzt oder nach der Erstellung eine zusätzliche Initialisierung erfordert, müssen Sie möglicherweise zusätzliche Methoden überschreiben. Weitere Informationen finden Sie unter Übersicht über Freezable-Objekte.

Das empfohlene Paradigma (verwendet von WPF-Animationen) besteht in der Verwendung von zwei Vererbungsebenen:

  1. Erstellen Sie eine abstrakte *<Typ*>AnimationBase-Klasse, die von AnimationTimeline abgeleitet wird. Diese Klasse sollte die TargetPropertyType-Methode außer Kraft setzen. Sie sollte außerdem eine neue abstrakte Methode, die GetCurrentValueCore-Methode, einführen und GetCurrentValue überschreiben, um die Typen der Parameter des Standardursprungswerts und des Standardzielwerts zu überprüfen. Anschließend ruft sie GetCurrentValueCore auf.

  2. Erstellen Sie eine weitere Klasse, die von Ihrer neuen Klasse * <Typ>*AnimationBase 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 Von/Bis-Animation oder Keyframe-Animation hat, sollten Sie evtl. eine ObjectAnimationUsingKeyFrames nutzen. Da es schwach typisiert ist, kann ObjectAnimationUsingKeyFrames jede Art von Wert animieren. Der Nachteil dieses Ansatzes ist, dass ObjectAnimationUsingKeyFrames nur diskrete Interpolation unterstützt.

Verwenden eines Pro-Frame-Rückrufs

Verwenden Sie diesen Ansatz, wenn Sie das WPF-Animationssystem vollständig umgehen müssen. Ein Szenario für diesen Ansatz sind Animationen in der Physik. Hier muss bei jedem Animationsschritt basierend auf dem letzten Satz von Objektinteraktionen eine neue Richtung oder Position des animierten Objekts berechnet werden.

Implementierungsanweisungen

Im Gegensatz zu den anderen in dieser Übersicht beschriebenen Methoden müssen Sie bei der Verwendung von Pro-Frame-Rückrufen keine benutzerdefinierte Animation 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. Immer wenn WPF die beibehaltenen Renderingdaten in der visuellen Struktur für die Kompositionsstruktur marshallt, wird die Ereignishandlermethode aufgerufen.

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

Um die Darstellungszeit des aktuellen Frames zu erhalten, können Sie die mit diesem Ereignis verknüpfte EventArgs als RenderingEventArgs umwandeln, die eine RenderingTime bereitstellt, mit der Sie die Rendering-Zeit des aktuellen Frames erhalten.

Weitere Informationen finden Sie auf der Rendering-Seite.

Weitere Informationen