2

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 从未被调用。诡异的?

4

1 回答 1

1

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

于 2009-10-17T16:47:32.750 回答