WPF Storyboard Completed事件中调用Stop()方法无效问题求助
解决Storyboard Completed事件中调用Stop()无效的问题
这问题我做WPF项目时也碰到过,核心原因其实很直白:当Completed事件触发的时候,Storyboard已经自动停止了,你这时候再调用Stop()自然不会有任何效果。
为什么Stop()没用?
Storyboard的生命周期逻辑是这样的:
- 调用
Begin()后,动画开始播放 - 动画播放完成后,系统会自动把Storyboard的状态设为
Stopped - 完成上述步骤后,才会触发
Completed事件
所以你能看到Console.WriteLine("Completed Event Fired")的输出,说明事件确实触发了,但此时动画早就已经停止了,Stop()调用相当于重复执行一个已经完成的操作,当然不会有任何可见变化。
针对你的需求的解决方案
先明确你实际想要达到的效果,再选对应的处理方式:
1. 只是确认动画结束后的状态
你调用Begin(this, true)时第二个参数isControllable设为true,这已经会让动画的最终属性值固化到StandbyGrid上了(比如透明度会停在动画结束的数值),完全不需要额外调用Stop()。
2. 想在动画结束后重置动画(为下一次播放做准备)
如果之后需要再次播放这个动画,可以在Completed事件里把Storyboard重置到初始状态:
private void ShowStandbyGrid() { StandbyGrid.Visibility = Visibility.Visible; Storyboard sbFadeIn = this.FindResource("StandbyGridFadeIn") as Storyboard; sbFadeIn.Completed += (s, a) => { Console.WriteLine("Completed Event Fired"); // 将动画重置到起始位置,方便后续再次调用Begin() sbFadeIn.Seek(this, TimeSpan.Zero, TimeSeekOrigin.BeginTime); }; sbFadeIn.Begin(this, true); }
3. 想清除动画对元素的影响
如果希望动画结束后,元素回到动画开始前的状态,可以调用Remove()方法:
sbFadeIn.Completed += (s, a) => { Console.WriteLine("Completed Event Fired"); // 清除动画对元素属性的修改,恢复初始值 sbFadeIn.Remove(this); };
额外注意点
- 别给Storyboard设置
RepeatBehavior="Forever",否则Completed事件永远不会触发 - 如果需要中途停止动画,应该在Completed事件之外的时机调用
Stop()(比如按钮点击事件)
内容的提问来源于stack exchange,提问作者WorldWind
相关产品推荐
相关产品推荐

