我不确定SO是否适合这类问题。但是,我会尝试一下。
因为它可以在互联网上找到,使用DispatcherTimer
进行WPF
中的倒计时,似乎是要走的路。所以我做到了。
我的问题是,计时器似乎不正确(太慢)。
我检查系统时钟(因此它不是100%但足够接近)。
它指出,1分钟的系统时钟只有大约58.5秒的计时器。当低于60岁时,它会变得更糟。
代码(ViewModel):
private readonly DispatcherTimer _timer = new DispatcherTimer(DispatcherPriority.Send, Application.Current.Dispatcher);
ctor(){
_timer.Interval = TimeSpan.FromSeconds(1);
_timer.IsEnabled = false;
_timer.Tick += TimerOnTick;
_timer.Start();
}
private void TimerOnTick(object sender, EventArgs e)
{
HandleTimeUpdateAsync();
}
private void HandleTimeUpdateAsync()
{
new Thread(() =>
{
CurrentTime = _currentTime.Add(_currentTime < TimeSpan.FromMinutes(1) ? TimeSpan.FromMilliSeconds(-100) : TimeSpan.FromSeconds(-1));
}
}
CurrentTime
是触发OnPropertyChanged
- 事件的属性,格式化时间显示为'mm:ss'(&gt; 60s)或'ss.f'(&lt; 60s)
private TimeSpan _currentTime;
private TimeSpan CurrentTime
{
get { return _currentTime; }
set
{
if (_currentTime == value)
{
return;
}
// set timer-interval to 1/10 second when last minute
if (value.TotalSeconds < 60 && _timer.Interval != new TimeSpan(0, 0, 0, 0, 100))
{
_timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
}
_currentTime = value;
OnPropertyChanged(nameof(FormattedCurrentTime));
}
}
我不知道我能做什么。我没看到的代码是否有错误?
编辑#1
通过注释,每个tick的处理比显示的代码更复杂。它不仅会更新CurrentTime
值。