Тайны расширения классов анимации WPF

Silverlight имеет свойство на своих временных шкалах анимации (например, DoubleAnimation), называемое EasingFunction, которое позволяет вам указать функцию, с которой нужно интерполировать два значения. Несмотря на то, что это входит в.NET 4, я хотел бы перенести это на 3.5. После прочтения это кажется вполне выполнимым, но у меня странная проблема.

Я расширяю DoubleAnimation примерно так:

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 ) );
}

Обратите внимание, что он не делает ничего интересного, кроме добавления нового свойства.

И тогда я могу использовать его в некотором коде:

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();

Этот код прекрасно запускает анимацию.

Но если я раскомментирую строку, которая устанавливает EasingFunction, анимация больше не запускается. Мой метод CreateInstanceCore вызывается, но GetCurrentValue никогда не вызывается. Weird?

1 ответ

Просто сделаю снимок в темноте здесь. Попробуйте изменить тип свойства на простой тип (int / string). Я подозреваю, что это может быть связано с тем, что ваш тип собственности EasingFunctionBase и вы пытаетесь заморозить экземпляр.

Другие вопросы по тегам