这是预期的行为吗?如果我在屏幕上有一个标签动画,我用canvas1.Children.Remove(label)
删除它,似乎动画继续在幕后运行甚至触发AnimationCompleted
,即使我没有引用标签或DoubleAnimation
我以前用它制作动画。如果动画无穷无尽怎么办?
我是否真的需要自己做簿记并在从父母那里删除控件时自行停止动画?
答案 0 :(得分:2)
我真的需要自己做记账吗
是的,您只能Animate
Dependency
个属性和Dependency
属性static
,所以即使Control
不再被引用Animation
将继续。
根据您Animation
的目的,您可能会像设置动画FillBehavior
到Stop
一样简单
animation.FillBehavior = FillBehavior.Stop;
这将在动画完成时停止动画TimeLine
,但如果你有重复的动画或动画设置某些值,动画停止动画属性将返回其原始值,这并不总是一个很好的解决方案立即
如果FillBehavior.Stop
在您的情况下不起作用,请以其他方式停止Animations
和Storyboards
。
如果Animation
是Storyboard
,您可以致电StopStoryboard
当您使用BeginStoryboard
时,您可以提供Name
,然后可以在StopStoryboard
中使用
<BeginStoryboard Name="myStoryboard" ......... />
<StopStoryboard BeginStoryboardName="myStoryboard" />
触发故事板示例:
<Trigger>
<Trigger.EnterActions>
<BeginStoryboard Name="myStoryboard">
<Storyboard ..... />
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<StopStoryboard BeginStoryboardName="myStoryboard" />
</Trigger.ExitActions>
</Trigger>
或者在幕后代码中,您只需在故事板上调用Stop
:
myStoryboard.Stop();
如果您在代码中创建一个简单的动画,则可以通过将null
TimeLine
应用于您设置为动画的DependencyProperty
来停止它。
示例:
// Start
myLabel.BeginAnimation(Canvas.LeftProperty, new DoubleAnimation(10.0, 100.0, new Duration(TimeSpan.FromSeconds(5)));
// Stop
myLabel.BeginAnimation(Canvas.LeftProperty, null);