Как отформатировать таймер WPF в формате ЧЧ: ММ: СС - PullRequest
0 голосов
/ 31 января 2019

Я работаю над программой, которая отображает время с момента нажатия кнопки.Проблема в том, что время отображается как «1», «2», «3» и т. Д., Когда я хочу, чтобы оно отображалось как «00:00:01», «00:00:02» * 1001.*

Это в WPF.Я искал все, чтобы найти людей, которые говорят, что вы используете

increment.ToString("hh\\:mm\\:ss\\);  

, но когда я делаю это, это буквально показывает "чч: мм: сс" в моей программе.Ниже мой код.Я отключил неважные вещи, чтобы тебе не приходилось читать все это.Заранее спасибо!

    private int increment = 0;

    private void dtTicker(object sender, EventArgs e)
    {
        increment++;
        lblTest.Content = increment.ToString("hh\\:mm\\:ss\\.fff");

    }

    private void StartStop_Click(object sender, EventArgs e)
    {
        DispatcherTimer dt = new DispatcherTimer();

        if ((string)StartStop.Content == "START")
        {
            dt.Interval = new TimeSpan(0, 0, 1);
            dt.Tick += dtTicker;
            dt.Start();

Ответы [ 4 ]

0 голосов
/ 31 января 2019

Чтобы получить истекшее время без учета времени, когда таймер был остановлен, вы должны сохранить два значения:

/// <summary>
/// Global counter that increments while the timer is active
/// </summary>
private TimeSpan totalElapsed = new TimeSpan(0);
/// <summary>
/// Save the last relevant point in time to compute the next elapsed increment
/// </summary>
private DateTime lastPointInTime = DateTime.MinValue;

Инициализировать lastPointInTime, когда таймер (пере) запускается

dt.Interval = new TimeSpan(0, 0, 1);
dt.Tick += dtTicker;
// reset lastPointInTime in order to skip time from when the timer was stopped
lastPointInTime = DateTime.Now;
dt.Start();

И используйте его для каждого тика, чтобы обновить totalElapsed перед его отображением

var nextPointInTime = DateTime.Now;
totalElapsed += (nextPointInTime - lastPointInTime);
lastPointInTime = nextPointInTime;
lblTest.Content = totalElapsed.ToString(@"hh\:mm\:ss"); // format string optional
0 голосов
/ 31 января 2019

Используемая вами строка формата предназначена для DateTime и TimeSpan, а не для целого числа.На самом деле нельзя полагаться на то, что DispatchTimer является точным на 100%, поэтому запишите текущее время при его запуске:

private DateTime start;

// .. start timer...
start = DateTime.Now;

Затем в обработчике тиков рассчитайте истекшее время и передайте строку этого форматавы используете:

TimeSpan elapsed = DateTime.Now - start;
string str = elapsed.ToString("hh\\:mm\\:ss");  
0 голосов
/ 31 января 2019

Вы работаете в ложном предположении, что DispatcherTimer будет запускать событие Tick точно каждую секунду.Это не обязательно так.
То, что вы хотите сделать, это взять время, когда оно началось, и показать количество времени, прошедшее после этого в каждом тике.Как то так:

private TimeSpan timeElapsed = TimeSpan.Zero;
private DateTime started = DateTime.MinValue;

private void StartStop_Click(object sender, EventArgs e)
{
    DispatcherTimer dt = new DispatcherTimer();

    if ((string)StartStop.Content == "START")
    {
        dt.Interval = new TimeSpan(0, 0, 1);
        dt.Tick += dtTicker;
        started = DateTime.Now;
        dt.Start();
    }
}

private void dtTicker(object sender, EventArgs e)
{
    timeElapsed = timeElapsed.Add(DateTime.Now - started);
    lblTest.Content = (timeElapsed).ToString(@"hh\:mm\:ss");

}

// This is how you reset the timer in this version.
private void ResetTimer()
{
    timeElapsed = TimeSpan.Zero;
}
0 голосов
/ 31 января 2019

Ваш таймер настроен с интервалом, равным 1 секунде. Если вы не изменили приращение переменной, иначе приращение должно отражать количество прошедших секунд.

Чтобы отобразить в требуемом формате, вы можете преобразовать число в TimeSpan, используя TimeSpan.FromSeconds

var increment = 34;
lblTest.Content =TimeSpan.FromSeconds(increment).ToString();

Обратите внимание, что форматирование по умолчанию - "чч: мм: сс", поэтому вы можете пропуститьформатирование '

Вывод

00:00:34
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...