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

标签 c# wpf animation dependency-properties

我尝试将 DependencyProperty 从一个值设置为目标值(在代码中)并在动画完成(或取消)时将最终值设置为属性(property)。最终值要么是 To 值(如果动画结束),要么是 当前 计算值(通过动画)当动画被取消时。

默认情况下,Animation 没有这种行为,并且 Animation 即使已经完成也不会更改实际值。

一次失败的尝试

前一段时间我写了这个辅助方法来实现上述行为:

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(property,null) 的人删除,Completed 事件似乎不会触发,因此当动画被取消时我无法正确设置最终值。更糟糕的是,我也无法删除事件处理程序...

有人知道如何以干净的方式做到这一点吗?

最佳答案

看起来您正在尝试将值设置回动画刚结束后动画开始之前的初始值。如果您停止动画(或动画时间轴结束时),这实际上会自动发生。在 WPF 中,动画可以看作是属性当前值之上的值叠加层。停止或删除动画将删除叠加层,并且先前的值现在将再次开始显示。原来的值(value)并没有丢失,只是暂时被遮蔽了。

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

如果您仍然觉得必须提取当前值并稍后恢复它,请使用 ReadLocalValue() 而不是 GetValue()。如果未在本地设置该值,这将返回 DepenencyProperty.UnsetValue。然后,您可以根据该属性最初是否具有本地值,有条件地调用 ClearValue() 或 SetValue()。

关于c# - 动画完成或取消时如何将动画的最终值设置为属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/589170/

相关文章:

c# - 根据当前上下文显示RibbonTab的内容

c# - 用FK关系向数据库插入数据

java - 离开 parent 时Android View 消失

r - 结合 R Markdown 和动画包

c# - 当 Windows Phone 8 map 控件开始和停止滚动时会触发什么事件?

C# 使用动态文本框/按钮/网格删除行

c# - 使用 ASP.NET 或 Sharepoint

c# - 从字典填充控制值?

WPF : Move and resize window at once time

javascript - 在不占用大量处理器的情况下移动 Google Maps API v3 中的标记?