DispatcherTimer无法重复启动?倒计时功能仅生效一次求助
问题原因及解决方法
核心问题
你代码里的关键错误是每次Tick事件触发时,都重新从原始的blockTime创建timeSpan,而不是更新并保存剩余的倒计时时间。比如初始blockTime是15分钟,第一次Tick减到14分钟,但下次Tick又重新拿15分钟来计算,等于剩余时间根本没被持久化更新。另外你在Tick里重复调用dispatcherTimer.Start()是多余的——定时器启动后会自动按间隔触发Tick,已经处于运行状态时调用Start()不会产生任何效果,反而导致后续Tick无法正常触发。
修复步骤
- 定义一个类级别的
TimeSpan变量,专门用来保存剩余的倒计时时间,替代每次从blockTime重新初始化的逻辑。 - 移除Tick事件里多余的
dispatcherTimer.Start()调用,让定时器按预设间隔自动触发。 - 每次Tick时直接更新剩余时间变量,并同步刷新UI显示。
修正后的代码
private TimeSpan _remainingTime; private DispatcherTimer dispatcherTimer; private async void Window_Activated(object sender, WindowActivatedEventArgs args) { // 初始化剩余时间为设定的总时长 _remainingTime = blockTime; // 避免重复创建定时器(窗口多次激活时生效) if (dispatcherTimer == null) { dispatcherTimer = new DispatcherTimer(); dispatcherTimer.Tick += dispatcherTimer_Tick; dispatcherTimer.Interval = new TimeSpan(0,1,0); } dispatcherTimer.Start(); } private void dispatcherTimer_Tick(object sender, object e) { if (_remainingTime > TimeSpan.Zero) { // 更新剩余时间 _remainingTime = _remainingTime.Subtract(TimeSpan.FromMinutes(1)); // 格式化显示,确保分钟为两位数(如0:05而非0:5) Countdown_TexBlock.Text = $"{_remainingTime.Hours}:{_remainingTime.Minutes:D2}"; } else { dispatcherTimer.Stop(); // 可在此添加倒计时结束后的处理逻辑 } }
内容的提问来源于stack exchange,提问作者KelvinJPS
相关产品推荐
相关产品推荐

