暂停倒计时继续
本文关键字:继续 倒计时 暂停 | 更新日期: 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;
// ...
}
编辑:更新运行时间逻辑