如何清除Canvas.Left依赖属性的动画,解决代码修改失效问题?
解决Canvas.Left动画清除问题
你遇到的问题本质是:动画结束后会通过FillBehavior.HoldEnd(默认值)维持属性的动画终值,导致后续代码修改Canvas.Left不生效。而BeginAnimation需要传入具体的DependencyProperty而非PropertyPath,其实解决起来很简单,分两种场景:
方法一:直接使用对应的依赖属性字段清除
WPF中每个依赖属性都有对应的静态DependencyProperty字段,命名规则是「属性名 + Property」,Canvas.Left对应的就是Canvas.LeftProperty。直接把它传给BeginAnimation即可:
// 清除Canvas.Left的动画 Image.BeginAnimation(Canvas.LeftProperty, null);
这样调用后,动画对Canvas.Left的控制就会被移除,后续通过代码修改Canvas.SetLeft(Image, 200);之类的操作就能正常生效了。
方法二:让动画结束后自动清除(更省心)
如果不想手动调用清除方法,可以在创建DoubleAnimation时设置FillBehavior为FillBehavior.Stop,这样动画结束后会自动释放对属性的控制,属性值会回到动画开始前的状态,后续修改也不受影响:
DoubleAnimation myDoubleAnimation = new DoubleAnimation { From = 1, To = 100, Duration = new Duration(TimeSpan.FromMilliseconds(500)), FillBehavior = FillBehavior.Stop // 关键设置 }; // 后续Storyboard代码不变 Storyboard.SetTarget(myDoubleAnimation, Image); Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath("(Canvas.Left)")); Storyboard myMovementStoryboard = new Storyboard(); myMovementStoryboard.Children.Add(myDoubleAnimation); myMovementStoryboard.Begin();
这个方法不需要额外写清除代码,适合大多数场景。
内容的提问来源于stack exchange,提问作者Melon NG
相关产品推荐
相关产品推荐

