我尝试将 DependencyProperty 从一个值动画到目标值(在代码中),当动画完成(或被取消)时,将最终值设置为属性。最终值将是动画结束时的 To 值或取消动画时的当前计算值(由动画)。
默认情况下,动画没有这种行为,即使动画已经完成,它也不会改变实际值。
一次失败的尝试
前段时间我写了这个辅助方法来实现上述行为:
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 事件似乎不会触发,因此在取消动画时我无法正确设置最终值。更糟糕的是我也无法删除事件处理程序......
有人知道如何以干净的方式做到这一点吗?