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。不可思议?
答案 0 :(得分:1)
这里要在黑暗中拍摄。尝试将属性的类型更改为简单类型(int
/ string
)。我怀疑它可能与您的属性类型为EasingFunctionBase
并且您尝试冻结实例的事实有关。