2009-10-17 4 views
2

Silverlight possède une propriété sur ses timelines d'animation (comme DoubleAnimation) appelée EasingFunction qui vous permet de spécifier une fonction avec laquelle interpoler deux valeurs. Même si cela arrive dans .NET 4, je voudrais porter ce à 3.5. Après avoir lu this, cela semble assez faisable, mais j'ai un problème étrange.Les mystères de l'extension des classes d'animation WPF

J'extension DoubleAnimation comme ceci:

class EasingDoubleAnimation : DoubleAnimation 
{ 
    protected override Freezable CreateInstanceCore() 
    { 
     return new EasingDoubleAnimation(); 
    } 

    protected override double GetCurrentValueCore(double defaultOriginValue, double defaultDestinationValue, AnimationClock animationClock) 
    { 
     Debug.WriteLine(animationClock.CurrentProgress.Value); 
     return base.GetCurrentValueCore(defaultOriginValue, defaultDestinationValue, animationClock); 
    } 

    public EasingFunctionBase EasingFunction 
    { 
     get { return (EasingFunctionBase) GetValue(EasingFunctionProperty); } 
     set { SetValue(EasingFunctionProperty, value); } 
    } 

    public static readonly DependencyProperty EasingFunctionProperty = 
     DependencyProperty.Register("EasingFunction", typeof(EasingFunctionBase), typeof(EasingDoubleAnimation), 
      new PropertyMetadata(null)); 
} 

Notez qu'il ne fait rien intéressant autre que l'ajout d'une nouvelle propriété.

Et puis je peux l'utiliser dans un code:

Storyboard sb = new Storyboard(); 
EasingDoubleAnimation ease = new EasingDoubleAnimation(); 
//ease.EasingFunction = new BackEase(); 
Storyboard.SetTarget(ease, MyTarget); 
Storyboard.SetTargetProperty(ease, new PropertyPath("(Canvas.Left)")); 
ease.To = 100; 
ease.Duration = TimeSpan.FromSeconds(3); 
sb.Children.Add(ease); 
sb.Begin(); 

Ce code fonctionne l'animation très bien. Mais, si je ne commente pas la ligne qui définit EasingFunction, l'animation ne s'exécute plus. Ma méthode CreateInstanceCore est appelée, mais GetCurrentValue n'est jamais appelée. Bizarre?

Répondre

1

Je vais juste prendre une photo dans le noir ici. Essayez de changer le type de la propriété en un type simple (int/string). Je suppose que cela peut avoir quelque chose à voir avec le fait que votre type de propriété est EasingFunctionBase et que vous essayez de geler l'instance.

+0

En fait, j'ai expérimenté avec cela avant de poster, et a constaté que tant que j'avais des types de propriétés simples, tout a bien fonctionné. Il semble que vous ne puissiez pas avoir de types de propriétés complexes sur les objets Freezable. "Alors, comment Silverlight 3 le fait-il?" Je demande, et je trouve dans Reflector que DoubleAnimation dans SL3 n'est pas réellement Freezable comme c'est le cas dans WPF. On dirait que je ne serais peut-être pas capable de faire ce que je veux faire de la manière la plus évidente. –

+0

Sauf si je rends également EasingFunctionBase Freezable. Alors ça marche, même si je ne serai pas capable de changer les propriétés dessus plus tard ... mais ça peut convenir dans mon cas. Merci pour la réponse. –

Questions connexes