C# 当动画完成或取消时,如何将动画的最终值设置为属性?

C# 当动画完成或取消时,如何将动画的最终值设置为属性?,c#,wpf,animation,dependency-properties,C#,Wpf,Animation,Dependency Properties,我尝试将DependencyProperty从一个值设置为一个目标值(在代码中),并在动画完成(或取消时)将最终值设置为该属性。如果动画完成,最终值将是“到”值,或者在动画取消时是当前计算的值(由动画) 默认情况下,动画不具有此行为,并且动画即使已完成,也不会更改实际值 失败的尝试 不久前,我编写了这个helper方法来实现上述行为: static void AnimateWithAutoRemoveAnimationAndSetFinalValue(IAnimatable element,

我尝试将DependencyProperty从一个值设置为一个目标值(在代码中),并在动画完成(或取消时)将最终值设置为该属性。如果动画完成,最终值将是“到”值,或者在动画取消时是当前计算的值(由动画)

默认情况下,动画不具有此行为,并且动画即使已完成,也不会更改实际值

失败的尝试 不久前,我编写了这个helper方法来实现上述行为:

static void AnimateWithAutoRemoveAnimationAndSetFinalValue(IAnimatable element,
    DependencyProperty property,
    AnimationTimeline animation)
{
    var obj = element as DependencyObject;
    if (obj == null)
        throw new ArgumentException("element must be of type DependencyObject");
    EventHandler handler = null;
    handler = (sender, e) =>
    {
        var finalValue = obj.GetValue(property);
        //remove the animation
        element.BeginAnimation(property, null);
        //reset the final value
        obj.SetValue(property, finalValue);

        animation.Completed -= handler;

    };

    animation.Completed += handler;

    element.BeginAnimation(property, animation);
}
不幸的是,如果有人调用BeginAnimation(属性,null)删除动画,则完成的事件似乎不会触发,因此在取消动画时,我无法正确设置最终值。更糟糕的是,我也无法删除事件处理程序


有人知道如何以干净的方式执行此操作吗?

看起来您正试图在动画刚刚结束后开始之前将值设置回初始值。如果停止动画(或动画时间线结束时),这实际上会自动发生。在WPF中,可以将动画视为属性当前值之上的值覆盖。停止或删除动画将删除覆盖,先前的值现在将再次开始显示。原始值并没有丢失,而是暂时模糊

通常,将属性显式设置回其先前的值是一种不好的做法,因为如果该值最初不是在对象上本地设置的,则会产生内存开销。此外,这可能会在以后引入一些微妙的问题。例如,如果旧值是从样式派生的,则如果样式发生更改,特性将不再更改


如果您仍然觉得必须提取当前值并在以后还原,请使用ReadLocalValue()而不是GetValue()。如果未在本地设置该值,则将返回DependencyProperty.UnsetValue。然后,您可以有条件地调用ClearValue()或SetValue(),具体取决于属性最初是否具有本地值。

谢谢您的回答,但代码并不是这样做的。“obj.GetValue(property)”在已完成的事件处理程序中执行,并将获得动画的最终值。我想做的是在属性本身上设置动画的最终值。如果您知道最终值是什么,一种方法是将最终值设置为属性的本地值,然后启动动画。动画完成后,动画层将被删除,最终值将显示出来。