You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:11:01