Freigeben über


Übersicht über benutzerdefinierte Animationen

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

Erforderliche Komponenten

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

Weil die Animationsklassen von der Freezable-Klasse erben, sollten Sie mit Freezable-Objekten und den Möglichkeiten der Vererbung von Freezable vertraut sein. Weitere Informationen finden Sie unter Übersicht über Freezable-Objekte.

Erweitern des Animationssystems

Je nach der integrierten Funktionalitätsebene, die Sie verwenden möchten, gibt es mehrere Möglichkeiten zur Erweiterung des WPF-Animationssystems. Im WPF-Animationsmodul gibt es drei primäre Erweiterungspunkte:

  • Erstellen Sie ein benutzerdefiniertes Keyframeobjekt durch Vererbung von einer der *<Typ>*KeyFrame-Klassen, z. B. DoubleKeyFrame. Bei diesem Ansatz werden die meisten der integrierten Funktionen des WPF-Animationsmoduls verwendet.

  • Erstellen Sie eine eigene Animationsklasse durch Vererbung von AnimationTimeline oder von einer der *<Typ>*AnimationBase-Klassen.

  • Generieren Sie durch Pro-Frame-Rückrufe Animationen auf einer Pro-Frame-Basis. Bei diesem Ansatz wird das Animations- und Zeitsteuerungssystem völlig umgangen.

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

Aktion

Vorgehensweise

Anpassen der Interpolation zwischen Werten eines Typs mit einer entsprechenden <Typ>AnimationUsingKeyFrames-Klasse

Erstellen Sie einen benutzerdefinierten Keyframe. Weitere Informationen finden Sie im Abschnitt Erstellen eines benutzerdefinierten Keyframes.

Anpassen nicht nur der Interpolation zwischen Werten eines Typs mit entsprechender <Typ>Animation-Klasse.

Erstellen Sie eine benutzerdefinierte Animationsklasse, die von der <Typ>AnimationBase-Klasse erbt, die dem zu animierenden Typ entspricht. Weitere Informationen finden Sie im Abschnitt Erstellen einer benutzerdefinierten Animationsklasse.

Animieren eines Typs ohne entsprechende WPF-Animation

Verwenden Sie 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 pro Frame berechnet werden und auf dem letzten Satz von Objektinteraktionen basieren

Verwenden Sie Pro-Frame-Rückrufe. Weitere Informationen finden Sie im Abschnitt Verwenden eines Pro-Frame-Rückrufs.

Erstellen eines benutzerdefinierten Keyframes

Die einfachste Möglichkeit zur Erweiterung des Animationssystems ist das Erstellen einer benutzerdefinierten Keyframeklasse. Verwenden Sie diesen Ansatz, wenn Sie eine andere Interpolationsmethode für eine Keyframeanimation verwenden möchten. Wie in Übersicht über Keyframe-Animationen beschrieben ist, verwendet eine Keyframeanimation Keyframeobjekte, um die Ausgabewerte zu generieren. Jedes Keyframeobjekt hat drei Funktionen:

  • Angeben eines Zielwerts mithilfe der Value-Eigenschaft

  • Angeben der Zeit, zu der der Wert erreicht sein soll, mithilfe der KeyTime-Eigenschaft

  • Interpolieren 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 zwischen 0 und 1. Der Fortschrittswert 0 gibt an, dass der Keyframe gerade gestartet wurde. Der Wert 1 gibt an, dass der Keyframe gerade abgeschlossen wurde und den von der entsprechenden Value-Eigenschaft festgelegten Wert zurückgeben sollte.

Da die *<Typ>*KeyFrame-Klassen von der Freezable-Klasse erben, müssen Sie auch den CreateInstanceCore-Kern überschreiben, damit eine neue Instanz der Klasse zurückgegeben wird. Falls die Klasse zur Speicherung der Daten keine Abhängigkeitseigenschaften verwendet oder nach der Erstellung eine zusätzliche Initialisierung erforderlich ist, müssen Sie möglicherweise zusätzliche Methoden überschreiben. Weitere Informationen finden Sie unter Übersicht über Freezable-Objekte.

Nachdem Sie die benutzerdefinierte *<Typ>*KeyFrame-Animation erstellt haben, können Sie diese gemeinsam mit *<Typ>*AnimationUsingKeyFrames für diesen Typ verwenden.

Erstellen einer benutzerdefinierten Animationsklasse

Durch Erstellen eines eigenen Animationstyps können Sie besser steuern, wie ein Objekt animiert wird. Zum Erstellen eines eigenen Animationstyps werden zwei Möglichkeiten empfohlen: Sie können von der AnimationTimeline-Klasse oder von der *<Typ>*AnimationBase-Klasse ableiten. Es wird davon abgeraten, von der *<Typ>*Animation-Klasse oder von der *<Typ>*AnimationUsingKeyFrames-Klasse abzuleiten.

Ableiten von <Typ>AnimationBase

Die Ableitung von einer *<Typ>*AnimationBase-Klasse ist die einfachste Methode zur Erstellung eines neuen Animationstyps. Verwenden Sie diesen Ansatz, wenn Sie eine neue Animation für einen Typ erstellen möchten, 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 AnimationClock. Damit bestimmen Sie den Fortschritt der Animation.

Da die *<Typ>*AnimationBase-Klassen von der Freezable-Klasse erben, müssen Sie auch den CreateInstanceCore-Kern überschreiben, damit eine neue Instanz der Klasse zurückgegeben wird. Falls die Klasse zur Speicherung der Daten keine Abhängigkeitseigenschaften verwendet oder nach der Erstellung eine zusätzliche Initialisierung erforderlich ist, 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 des zu animierenden Typs. 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 möchten, der noch nicht über eine entsprechende WPF-Animation verfügt, oder wenn Sie eine Animation ohne starke Typisierung erstellen möchten.

Implementierungsanweisungen

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

  • CreateInstanceCore – Wenn es sich bei der neuen Klasse um eine konkrete Klasse handelt, müssen Sie CreateInstanceCore überschreiben, damit eine neue Instanz der Klasse zurückgegeben wird.

  • GetCurrentValue – Überschreiben Sie diese Methode, damit der aktuelle Wert der Animation zurückgegeben wird. Übernommen werden drei Parameter: ein Standardursprungswert, ein Standardzielwert und ein AnimationClock-Wert. Verwenden Sie AnimationClock, um die aktuelle Zeit oder den Fortschritt für die Animation abzurufen. Sie können festlegen, ob die Standardursprungs- und -zielwerte verwendet werden.

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

  • TargetPropertyType – Überschreiben Sie diese Eigenschaft, um den Type von der Animation erzeugten Ausgabe anzugeben.

Falls die Klasse zur Speicherung der Daten keine Abhängigkeitseigenschaften verwendet oder nach der Erstellung eine zusätzliche Initialisierung erforderlich ist, müssen Sie möglicherweise zusätzliche Methoden überschreiben. Weitere Informationen finden Sie unter Übersicht über Freezable-Objekte.

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

  1. Erstellen Sie eine abstrakte *<Type>*AnimationBase-Klasse, die von AnimationTimeline abgeleitet wird. Diese Klasse sollte die TargetPropertyType-Methode überschreiben. Darüber hinaus sollte sie eine neue abstrakte Methode (GetCurrentValueCore) 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 der neuen *<Type>*AnimationBase-Klasse erbt und die CreateInstanceCore-Methode, die von Ihnen eingeführte GetCurrentValueCore-Methode sowie die IsDestinationDefault-Eigenschaft überschreibt.

Alternative Ansätze

Wenn Sie einen Typ ohne entsprechende From/To/By-Animation oder Keyframeanimation erstellen möchten, sollten Sie ObjectAnimationUsingKeyFrames verwenden. Da ObjectAnimationUsingKeyFrames schwach typisiert ist, lassen sich damit sämtliche Typen von Werten animieren. Der Nachteil dieses Ansatzes ist, dass ObjectAnimationUsingKeyFrames nur die 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

Anders als bei den anderen in dieser Übersicht beschriebenen Ansätzen brauchen Sie zur Verwendung von Pro-Frame-Rückrufen keine benutzerdefinierte Animation oder Keyframeklasse zu erstellen.

Stattdessen registrieren Sie sich für das Rendering-Ereignis des Objekts, das die zu animierenden Objekte enthält. 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 mit diesen Werten animiert werden sollen.

Um die Präsentationszeit des aktuellen Frames abzurufen, können die diesem Ereignis zugewiesenen EventArgs in RenderingEventArgs umgewandelt werden. Hierdurch wird eine RenderingTime-Eigenschaft bereitgestellt, mit deren Hilfe Sie die Renderingzeit des aktuellen Frames abrufen können.

Weitere Informationen finden Sie auf der Seite Rendering.

Siehe auch

Referenz

AnimationTimeline

IKeyFrame

Konzepte

Übersicht über die Verfahren zur Animation von Eigenschaften

Übersicht über Freezable-Objekte

Übersicht über From/To/By-Animationen

Übersicht über Keyframe-Animationen

Übersicht über Pfadanimationen

Übersicht über Animationen

Übersicht über das Animations- und Zeitsteuerungssystem

Weitere Ressourcen

Beispiel für benutzerdefinierte Animation