暂停倒计时继续

本文关键字:继续 倒计时 暂停 | 更新日期: 2023-09-27 18:04:13

我有一个倒计时,它使用了这个问题的第二个答案中推荐的方法(从当前时间减去开始时间)。

问题是,当我暂停它,然后恢复它几秒钟后,虽然显示器冻结,倒计时在间隔继续。我知道这是因为开始时间和当前时间没有改变(!),但我想不出如何合乎逻辑地补救它。

选中的代码:

private DispatcherTimer cdTimer;
private DateTime startTime;
private TimeSpan countdownFrom = new TimeSpan(0, 30, 0);
cdTimer= new DispatcherTimer();
cdTimer.Interval = new TimeSpan(0, 0, 0, 0, 1);
showTime.Text = countdownFrom .Minutes.ToString("D2") + ':' + countdownFrom .Seconds.ToString("D2");
void cdTimer_Tick(object sender, EventArgs e)
{
  TimeSpan difference = DateTime.Now - startTime;
  TimeSpan countdown = countdownFrom - difference;
  showTime.Text = countdown.Minutes.ToString("D2") + ':' + countdown.Seconds.ToString("D2");
  if (countdown.Hours == 0 && countdown.Minutes == 0 && countdown.Seconds == 0 &&   countdown.Milliseconds <= 100)
  {
    cdTimer.Stop();
    cdTimer.Tick -= new EventHandler(cdTimer_Tick);
  }
}
private void start_Click(object sender, RoutedEventArgs e)
{
  startTime = DateTime.Now;
  cdTimer.Tick += new EventHandler(cdTimer_Tick);
  cdTimer.Start();
}
private void pause_Click(object sender, RoutedEventArgs e)
{
  if (!paused) {
    cdTimer.Stop();
    paused = true;
  } else {
    cdTimer.Start();
    paused = false;
  }
}

暂停倒计时继续

每次暂停时,都保存到目前为止的运行时间。然后将其添加到计算中:

    private TimeSpan _runningTime = new TimeSpan();
    private void pause_Click()
    {
     if (!paused) {
       _runningTime = _runningTime.Add(DateTime.Now - startTime);
       cdTimer.Stop();
       paused = true;
     } else {
       startTime = DateTime.Now;
       cdTimer.Start();
       paused = false;
     }
    }
    void cdTime_Tick()
    {
        // ...
        TimeSpan difference = DateTime.Now - startTime;
        difference = difference.Add(_runningTime);
        TimeSpan countdown = countdownFrom - difference;
        // ...
    }

编辑:更新运行时间逻辑