Тайны расширения классов анимации 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
и вы пытаетесь заморозить экземпляр.