Буду признателен за помощь в решении следующей проблемы - вы можете увидеть эту проблему на моем таймере покерных блайндов :
Основные часы (обратный отсчет по таймеру вслепую) запускаются в 20:00, а затем переходят в 19:58. Таймер уровня (который отсчитывается в верхней части экрана) - синхронизируется и, следовательно, является секундой.
Вот мой код: XAML:
TextBlock Text="{Binding TimeLeftInCurrentBlindFormatted}"
и мой турнирный класс:
private DispatcherTimer timerBlind;
private DateTime? blindTimeStarted = null;
public DateTime? BlindTimeStarted
{
get
{
return blindTimeStarted;
}
set
{
if (blindTimeStarted != value)
{
blindTimeStarted = value;
OnPropertyChanged("BlindTimeStarted");
OnPropertyChanged("TimeLeftInCurrentBlind");
OnPropertyChanged("TimeLeftInCurrentBlindFormatted");
OnPropertyChanged("TimeRunningForCurrentBlind");
OnPropertyChanged("TimeRunningForCurrentBlindFormatted");
}
}
}
public TimeSpan TimeLeftInCurrentBlind
{
get
{
return BlindTimeStarted == null ? blindset.CurrentBlind.BlindDuration : BlindTimeStarted.Value.Add(blindset.CurrentBlind.BlindDuration).Subtract(DateTime.UtcNow.Subtract(TotalTimePausedForCurrentBlind));
}
}
public string TimeLeftInCurrentBlindFormatted
{
get { return Utils.FormatTime(TimeLeftInCurrentBlind); }
}
void Timer_Tick(object sender, EventArgs e)
{
if (IsTimerBlindRunning)
{
OnPropertyChanged("TimeRunningForCurrentBlindFormatted");
OnPropertyChanged("TimeLeftInCurrentBlindFormatted");
}
}
}
Когда таймер запускается через пользовательский интерфейс, устанавливается дата и время:
TimeStarted = DateTime.UtcNow;
Я предполагаю, что это как-то связано с тем фактом, что тик не обязательно точно равен секунде, а интерфейс пользователя как-то отстает и пропускает секунду, но оба таймера обновляются в событии тика одновременно (TimeRunningForCurrentBlindFormatted верхнее истекшее время) и TimeLeftInCurrentBlindFormatted).
В моей системе разработки таймер работает с 20:00 до 19:59, а затем до 19: 57.