【问题标题】:The mysteries of extending the WPF animation classes扩展WPF动画类的奥秘
【发布时间】:2009-10-17 16:42:08
【问题描述】:

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 从未被调用。奇怪吗?

【问题讨论】:

    标签: wpf animation freezable


    【解决方案1】:

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

    【讨论】:

    • 我在发帖前实际尝试过,发现只要我有简单的属性类型,一切都很好。看起来你不能在 Freezable 对象上拥有复杂的属性类型。 “那么 Silverlight 3 是如何做到的呢?”我问,我在 Reflector 中发现 SL3 中的 DoubleAnimation 实际上不像 WPF 中那样可冻结。似乎我可能无法以明显的方式做我想做的事情。
    • 除非我让 EasingFunctionBase 也可冻结。然后它就可以工作了,虽然我以后无法更改它的属性......但在我的情况下这可能没问题。感谢您的回复。
    猜你喜欢
    • 2016-07-31
    • 2010-11-21
    • 2021-11-14
    • 2010-11-19
    • 2015-01-16
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多