扩展WPF动画类的奥秘

时间:2009-10-17 16:42:09

标签: wpf animation freezable

Silverlight在其动画时间轴(如DoubleAnimation)上有一个名为EasingFunction的属性,它允许您指定一个用于插入两个值的函数。虽然它是在.NET 4中出现的,但我想把它移植到3.5。阅读this之后,这似乎很可行,但我遇到了一个奇怪的问题。

我正在扩展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。不可思议?

1 个答案:

答案 0 :(得分:1)

这里要在黑暗中拍摄。尝试将属性的类型更改为简单类型(int / string)。我怀疑它可能与您的属性类型为EasingFunctionBase并且您尝试冻结实例的事实有关。