gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:37:06 25 4
gpt4 key购买 nike

我尝试将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com