Übersicht über benutzerdefinierte AnimationenCustom Animations Overview

In diesem Thema wird beschrieben, wie und wann das WPFWPF-Animationssystem durch Erstellen benutzerdefinierter Keyframes oder Animationsklassen erweitert oder durch Pro-Frame-Rückrufe umgangen wird.This topic describes how and when to extend the WPFWPF animation system by creating custom key frames, animation classes, or by using per-frame callback to bypass it.

VorraussetzungenPrerequisites

Um dieses Thema zu verstehen, sollten Sie mit den verschiedenen Arten von Animationen vertraut sein, die von WPFWPF bereitgestellt werden.To understand this topic, you should be familiar with the different types of animations provided by the WPFWPF. Weitere Informationen finden Sie unter Übersicht über die From/To/By-Animationen, Übersicht über Keyframe-Animationen und Übersicht über Pfadanimationen.For more information, see the From/To/By Animations Overview, the Key-Frame Animations Overview, and the Path Animations Overview.

Da die Animationsklassen erben die Freezable -Klasse, Sie sollten mit vertraut sein Freezable Objekte "und" Gewusst wie: erben von Freezable.Because the animation classes inherit from the Freezable class, you should be familiar with Freezable objects and how to inherit from Freezable. Weitere Informationen finden Sie unter der Übersicht über Freezable-Objekte.For more information, see the Freezable Objects Overview.

Erweitern des AnimationssystemsExtending the Animation System

Es gibt zahlreiche Methoden zum Erweitern des WPFWPF-Animationssystems, abhängig von der Ebene der integrierten Funktionen, die Sie verwenden möchten.There are a number of ways to extend the WPFWPF animation system, depending on the level of built-in functionality you want to use. Es gibt drei primäre Erweiterungspunkte in der WPFWPF-Animations-Engine:There are three primary extensibility points in the WPFWPF animation engine:

  • Erstellen Sie ein benutzerdefiniertes Keyframe-Objekt durch Erben von einer von der <Typ > KeyFrame-Klassen, z. B. DoubleKeyFrame.Create a custom key frame object by inheriting from one of the <Type> KeyFrame classes, such as DoubleKeyFrame. Dieser Ansatz verwendet die meisten der integrierten Funktionen der WPFWPF-Animations-Engine.This approach uses most of the built-in functionality of the WPFWPF animation engine.

  • Erstellen Sie eine eigene Animationsklasse durch Vererbung von AnimationTimeline mindestens eine der <Typ > AnimationBase-Klassen.Create your own animation class by inheriting from AnimationTimeline or one of the <Type> AnimationBase classes.

  • Verwenden Sie Pro-Frame-Rückruf, um Animationen auf einer Pro-Frame-Basis zu generieren.Use per-frame callback to generate animations on a per-frame basis. Bei diesem Ansatz werden die Animations- und Zeitsteuerungssysteme vollständig umgangen.This approach completely bypasses the animation and timing system.

In der folgenden Tabelle werden einige die Szenarios zur Erweiterung des Animationssystems beschrieben.The following table describes some the scenarios for extending the animation system.

AktionWhen you want to... VorgehensweiseUse this approach
Anpassen der Interpolation zwischen Werten eines Typs mit einer entsprechenden <Typ> AnimationUsingKeyFramesCustomize the interpolation between values of a type that has a corresponding <Type> AnimationUsingKeyFrames Erstellen Sie ein benutzerdefiniertes Keyframe.Create a custom key frame. Weitere Informationen finden Sie im Abschnitt Erstellen eines benutzerdefinierten Keyframe.For more information, see the Create a Custom Key Frame section.
Anpassen von mehr als einer Interpolation zwischen Werten eines Typs mit einer entsprechenden <Typ> AnimationCustomize more than just the interpolation between values of a type that has a corresponding <Type> Animation. Erstellen Sie eine benutzerdefinierte Animationsklasse, die von der <Typ> AnimationBase-Klasse erbt, die dem Typ entspricht, den Sie animieren möchten.Create a custom animation class that inherits from the <Type> AnimationBase class that corresponds to the type you want to animate. Weitere Informationen finden Sie im Abschnitt Erstellen einer benutzerdefinierten Animationsklasse.For more information, see the Create a Custom Animation Class section.
Animieren eines Typs, der keine entsprechende WPFWPF-Animation besitztAnimate a type that has no corresponding WPFWPF animation Verwenden einer ObjectAnimationUsingKeyFrames oder erstellen Sie eine Klasse, die von erbt AnimationTimeline.Use an ObjectAnimationUsingKeyFrames or create a class that inherits from AnimationTimeline. Weitere Informationen finden Sie im Abschnitt Erstellen einer benutzerdefinierten Animationsklasse.For more information, see the Create a Custom Animation Class section.
Animieren mehrerer Objekte mit Werten, die pro Frame berechnet werden und auf dem letzten Satz von Objektinteraktionen basierenAnimate multiple objects with values that are computed each frame and are based on the last set of object interactions Verwenden Sie einen Pro-Frame-Rückruf.Use per-frame callback. Weitere Informationen finden Sie im Abschnitt Verwenden eines Pro-Frame-Rückrufs.For more information, see the Create a Use Per-Frame Callback section.

Erstellen eines benutzerdefinierten KeyframesCreate a Custom Key Frame

Die einfachste Möglichkeit zum Erweitern des Animationssystems ist das Erstellen einer benutzerdefinierten Keyframe-Klasse.Creating a custom key frame class is the simplest way to extend the animation system. Verwenden Sie diesen Ansatz, wenn Sie eine andere Interpolationsmethode für eine Keyframe-Animation möchten.Use this approach when you want to a different interpolation method for a key-frame animation. Wie in Übersicht über Keyframe-Animationen beschrieben ist, verwendet eine Keyframe-Animation Keyframe-Objekte, um die Ausgabewerte zu generieren.As described in the Key-Frame Animations Overview, a key-frame animation uses key frame objects to generate its output values. Jedes Keyframe-Objekt hat drei Funktionen:Each key frame object performs three functions:

  • Gibt an, ein Ziel mithilfe der Value Eigenschaft.Specifies a target value using its Value property.

  • Gibt die Uhrzeit, an dem dieser Wert erreicht sein soll mithilfe, der KeyTime Eigenschaft.Specifies the time at which that value should be reached using its KeyTime property.

  • Interpoliert zwischen dem Wert des vorherigen Keyframes und dem eigenen Wert durch Implementieren der InterpolateValueCore-Methode.Interpolates between the value of the previous key frame and its own value by implementing the InterpolateValueCore method.

ImplementierungsanweisungenImplementation Instructions

Leiten Sie von der abstrakten <Typ> KeyFrame-Klasse ab, und implementieren Sie die InterpolateValueCore-Methode.Derive from the <Type> KeyFrame abstract class and implement the InterpolateValueCore method. Die InterpolateValueCore-Methode gibt den aktuellen Wert des Keyframes zurück.The InterpolateValueCore method returns the current value of the key frame. Es werden zwei Parameter übernommen: der Wert des vorherigen Keyframes und ein Fortschrittswert, der zwischen 0 und 1 liegt.It takes two parameters: the value of the previous key frame and a progress value that ranges from 0 to 1. Ein Fortschrittswert von 0 gibt an, der Keyframe gerade gestartet wurde, und der Wert 1 gibt an, dass der Keyframe gerade abgeschlossen wurde, und sollte den Wert von zurückgeben seiner Value Eigenschaft.A progress of 0 indicates the key frame has just started, and a value of 1 indicates that the key frame has just completed and should return the value specified by its Value property.

Da die <Typ > KeyFrame-Klassen erben von der Freezable -Klasse, müssen Sie auch überschreiben CreateInstanceCore Core, um eine neue Instanz der Klasse zurückzugeben.Because the <Type> KeyFrame classes inherit from the Freezable class, you must also override CreateInstanceCore core to return a new instance of your class. 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.If the class does not use dependency properties to store its data or it requires extra initialization after creation, you might need to override additional methods; see the Freezable Objects Overview for more information.

Nach der Erstellung von benutzerdefinierten <Typ> KeyFrame-Animationen können Sie sie mit den <Typ> AnimationUsingKeyFrames für diesen Typ verwenden.After you've created your custom <Type> KeyFrame animation, you can use it with the <Type> AnimationUsingKeyFrames for that type.

Erstellen einer benutzerdefinierten AnimationsklasseCreate a Custom Animation Class

Beim Erstellen Ihres eigenen Animationstyps können Sie besser steuern, wie ein Objekt animiert wird.Creating your own animation type gives you more control over how an object in animated. Es gibt zwei empfohlene Methoden zur Erstellung Ihrer eigenen Animationstyps: Es sind ableitungen von den AnimationTimeline Klasse oder die <Typ > AnimationBase-Klasse.There are two recommended ways to create your own animation type: you can derive from the AnimationTimeline class or the <Type> AnimationBase class. Das Ableiten von der <Typ> Animation- oder der <Typ> AnimationUsingKeyFrames-Klasse wird nicht empfohlen.Deriving from the <Type> Animation or <Type> AnimationUsingKeyFrames classes is not recommended.

Ableiten von <Typ>AnimationBaseDerive from <Type>AnimationBase

Das Ableiten von einer <Typ> AnimationBase-Klasse ist die einfachste Möglichkeit zum Erstellen eines neuen Animationstyps.Deriving from a <Type> AnimationBase class is the simplest way to create a new animation type. Verwenden Sie diesen Ansatz, wenn Sie eine neue Animation für einen Typ erstellen, der bereits über eine entsprechende <Typ> AnimationBase-Klasse verfügt.Use this approach when you want to create a new animation for type that already has a corresponding <Type> AnimationBase class.

ImplementierungsanweisungenImplementation Instructions

Leiten Sie von einer <Typ> Animation-Klasse ab und implementieren Sie die GetCurrentValueCore-Methode.Derive from a <Type> Animation class and implement the GetCurrentValueCore method. Die GetCurrentValueCore-Methode gibt den aktuellen Wert der Animation zurück.The GetCurrentValueCore method returns the current value of the animation. Es werden drei Parameter übernommen: Ein vorgeschlagener Anfangswert, ein vorgeschlagener Endwert und eine AnimationClock, die Sie verwenden, um den Fortschritt der Animation zu bestimmen.It takes three parameters: a suggested starting value, a suggested ending value, and an AnimationClock, which you use to determine the progress of the animation.

Da die <Typ > AnimationBase-Klassen erben von der Freezable -Klasse, müssen Sie auch überschreiben CreateInstanceCore Core, um eine neue Instanz der Klasse zurückzugeben.Because the <Type> AnimationBase classes inherit from the Freezable class, you must also override CreateInstanceCore core to return a new instance of your class. 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.If the class does not use dependency properties to store its data or it requires extra initialization after creation, you might need to override additional methods; see the Freezable Objects Overview for more information.

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.For more information, see the GetCurrentValueCore method documentation for the <Type> AnimationBase class for the type that you want to animate. Ein Beispiel hierfür finden Sie unter Beispiel für benutzerdefinierte AnimationFor an example, see the Custom Animation Sample

Alternative AnsätzeAlternative Approaches

Wenn Sie lediglich die Art der Interpolation von Animationswerten ändern möchten, kommt eine Ableitung von einer der <Typ> KeyFrame-Klassen infrage.If you simply want to change how animation values are interpolated, considering deriving from one of the <Type> KeyFrame classes. Der von Ihnen erstellte Keyframe kann mit den entsprechenden <Typ> AnimationUsingKeyFrames verwendet werden, die von WPFWPF bereitgestellt werden.The key frame you create can be used with the corresponding <Type> AnimationUsingKeyFrames provided by WPFWPF.

Ableiten von AnimationTimelineDerive from AnimationTimeline

Leiten Sie von der AnimationTimeline Klasse, wenn Sie möchten eine Animation für einen Typ erstellen, das bereits ein entsprechendes keine WPFWPF Animation, oder Sie möchten eine Animation zu erstellen, die nicht stark typisiert ist.Derive from the AnimationTimeline class when you want to create an animation for a type that doesn't already have a matching WPFWPF animation, or you want to create an animation that is not strongly typed.

ImplementierungsanweisungenImplementation Instructions

Leiten Sie von der AnimationTimeline Klasse, und überschreiben Sie die folgenden Elemente:Derive from the AnimationTimeline class and override the following members:

  • CreateInstanceCore – Wenn die neue Klasse konkret ist, müssen Sie Sie überschreiben CreateInstanceCore um eine neue Instanz der Klasse zurückzugeben.CreateInstanceCore – If your new class is concrete, you must override CreateInstanceCore to return a new instance of your class.

  • GetCurrentValue – Überschreiben Sie diese Methode, um den aktuellen Wert Ihrer Animation zurückzugeben.GetCurrentValue – Override this method to return the current value of your animation. Es werden drei Parameter übernommen: ein Standardursprungswert, ein Standardzielwert und eine AnimationClock.It takes three parameters: a default origin value, a default destination value, and an AnimationClock. Verwenden der AnimationClock um die aktuelle Uhrzeit oder den Fortschritt der Animation zu erhalten.Use the AnimationClock to obtain the current time or progress for the animation. Sie können auswählen, ob die Standardursprungs- oder zielwerte verwendet werden.You can choose whether to use the default origin and destination values.

  • IsDestinationDefault – Überschreiben Sie diese Eigenschaft, um anzugeben, ob die Animation den Standardzielwert gemäß verwendet die GetCurrentValue Methode.IsDestinationDefault – Override this property to indicate whether your animation uses the default destination value specified by the GetCurrentValue method.

  • TargetPropertyType – Überschreiben Sie diese Eigenschaft an, dass die Type der Ausgabe der Animation erzeugten.TargetPropertyType – Override this property to indicate the Type of output your animation produces.

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.If the class does not use dependency properties to store its data or it requires extra initialization after creation, you might need to override additional methods; see the Freezable Objects Overview for more information.

Das empfohlene Paradigma (verwendet von WPFWPF-Animationen) besteht in der Verwendung von zwei Vererbungsebenen:The recommended paradigm (used by WPFWPF animations) is to use two inheritance levels:

  1. Erstellen Sie eine abstrakte <Typ > AnimationBase-Klasse, die von abgeleitet AnimationTimeline.Create an abstract <Type> AnimationBase class that derives from AnimationTimeline. Diese Klasse sollte überschreiben die TargetPropertyType Methode.This class should override the TargetPropertyType method. Sollte auch eine neue abstrakte Methode GetCurrentValueCore, einführen und außer Kraft setzen GetCurrentValue , damit sie die Typen des Standardursprungswerts und Parameter überprüft hat, ruft Sie GetCurrentValueCore.It should also introduce a new abstract method, GetCurrentValueCore, and override GetCurrentValue so that it validates the types of the default origin value and default destination value parameters, then calls GetCurrentValueCore.

  2. Erstellen Sie eine andere Klasse, die erbt von der neuen <Typ > AnimationBase-Klasse und überschreibt die CreateInstanceCore -Methode, die GetCurrentValueCore-Methode, die Sie eingeführt, und die IsDestinationDefault Eigenschaft.Create another class that inherits from your new <Type> AnimationBase class and overrides the CreateInstanceCore method, the GetCurrentValueCore method that you introduced, and the IsDestinationDefault property.

Alternative AnsätzeAlternative Approaches

Wenn Sie einen Typ zu animieren, die ohne entsprechende From/To/By-Animation Keyframe-Animation oder möchten, sollten Sie verwenden eine ObjectAnimationUsingKeyFrames.If you want to animate a type that has no corresponding From/To/By animation or key-frame animation, consider using an ObjectAnimationUsingKeyFrames. Da schwach typisiert ist, ist ein ObjectAnimationUsingKeyFrames können jede Art von Wert animieren.Because it is weakly typed, an ObjectAnimationUsingKeyFrames can animate any type of value. Der Nachteil dieses Ansatzes besteht darin, die ObjectAnimationUsingKeyFrames unterstützt nur diskreten Interpolation.The drawback to this approach is that ObjectAnimationUsingKeyFrames only supports discrete interpolation.

Verwenden eines Pro-Frame-RückrufsUse Per-Frame Callback

Verwenden Sie diesen Ansatz, wenn Sie das WPFWPF-Animationssystem vollständig umgehen müssen.Use this approach when you need to completely bypass the WPFWPF animation system. 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.One scenario for this approach is physics animations, where at each animation step a new direction or position of animated objects needs to be recomputed based on the last set of object interactions.

ImplementierungsanweisungenImplementation Instructions

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.Unlike the other approaches described in this overview, to use per-frame callback you don't need to create a custom animation or key frame class.

Stattdessen registrieren Sie sich für die Rendering -Ereignis des Objekts, das die Objekte enthält, Sie animieren möchten.Instead, you register for the Rendering event of the object that contains the objects you want to animate. Diese Ereignishandlermethode wird einmal pro Frame aufgerufen.This event handler method gets called once per frame. Immer wenn WPFWPF die beibehaltenen Renderingdaten in der visuellen Struktur für die Kompositionsstruktur marshallt, wird die Ereignishandlermethode aufgerufen.Each time that WPFWPF marshals the persisted rendering data in the visual tree across to the composition tree, your event handler method is called.

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.In your event handler, perform your whatever calculations necessary for your animation effect and set the properties of the objects you want to animate with these values.

Um die Präsentationszeit des aktuellen Frames, erhalten die EventArgs zugeordnete Ereignis umgewandelt werden kann RenderingEventArgs, bieten eine RenderingTime -Eigenschaft, die Sie verwenden können, um den aktuellen Frame abzurufen des rendering-Zeit.To obtain the presentation time of the current frame, the EventArgs associated with this event can be cast as RenderingEventArgs, which provide a RenderingTime property that you can use to obtain the current frame's rendering time.

Weitere Informationen finden Sie unter den Rendering Seite.For more information, see the Rendering page.

Siehe auchSee also