Как изменить секунды в таймере обратного отсчета

179
07 августа 2021, 13:40

Есть класс взят отсюда:

using System;
public class CountDownTimer : IDisposable
{
    public Action TimeChanged;
    public Action CountDownFinished;
    public bool IsRunnign => timer.Enabled;
    public int StepMs
    {
        get => timer.Interval;
        set => timer.Interval = value;
    }
    private Timer timer = new Timer();
    private DateTime _maxTime = new DateTime(1, 1, 1, 0, 30, 0);
    private DateTime _minTime = new DateTime(1, 1, 1, 0, 0, 0);
    public DateTime TimeLeft { get; private set; }
    private long TimeLeftMs => TimeLeft.Ticks / TimeSpan.TicksPerMillisecond;
    public string TimeLeftStr => TimeLeft.ToString("mm:ss");
    public string TimeLeftMsStr => TimeLeft.ToString("mm:ss.fff");
    private void TimerTick(object sender, EventArgs e)
    {
        if (TimeLeftMs > timer.Interval)
        {
            TimeLeft = TimeLeft.AddMilliseconds(-timer.Interval);
            TimeChanged?.Invoke();
        }
        else
        {
            Stop();
            TimeLeft = _minTime;
            TimeChanged?.Invoke();
            CountDownFinished?.Invoke();
        }
    }
    public CountDownTimer(int min, int sec)
    {
        SetTime(min, sec);
        Init();
    }
    public CountDownTimer(DateTime dt)
    {
        SetTime(dt);
        Init();
    }
    public CountDownTimer()
    {
        Init();
    }
    private void Init()
    {
        TimeLeft = _maxTime;
        StepMs = 1000;
        timer.Tick += new EventHandler(TimerTick);
    }
    public void SetTime(DateTime dt) {
        TimeLeft = _maxTime = dt;
        TimeChanged?.Invoke();
    }
    public void SetTime(int min, int sec=0) => SetTime(new DateTime(1, 1, 1, 0, min, sec));
    public void Start() => timer.Start();
    public void Pause() => timer.Stop();
    public void Stop()
    {
        Pause();
        Reset();
    }
    public void Reset()
    {
        TimeLeft = _maxTime;
    }
    public void Restart()
    {
        Reset();
        Start();
    }
    public  void Dispose() => timer.Dispose();
}

Вызов:

CountDownTimer timer = new CountDownTimer();//создаем инстанс
timer.SetTime(1,0); //выставляем на 1 минуту
timer.StepMs = 33; //Выставляем шаг таймера (как часто вызывается TimeChanged)
//Подписываемся на событие TimeChanged и в нем обновляем значение лейбла
timer.TimeChanged += () => Label1.Text = timer.TimeLeftMsStr; 
// Подписываемся на событие окончания таймера и реагируем на него сообщухой
timer.CountDownFinished += () => MessageBox.Show("Timer finished the work!"); 
timer.Start(); //стартуем

Как изменить секунды чтобы было не 999 а от 60 сек ?

Получается сейчас такой вид: 10:10.999 а нужно 10:10:60 - Одна минута 60 секунд.

И с помощью этого класса можно реализовать не обратный отсчёт а наоборот текущее время и дата сделать ( ну или к дополнению ) ?

[Последнее изменение в коде]

private void Form_Load(object sender, EventArgs e)
{
  CountDownTimer timer = new CountDownTimer();//создаем инстанс
  timer.SetTime(1,0); //выставляем на 1 минуту
  //timer.StepMs = 33; //Выставляем шаг таймера (как часто вызывается 
  TimeChanged)
  //Подписываемся на событие TimeChanged и в нем обновляем значение лейбла
  timer.TimeChanged += () => Label1.Text = timer.TimeLeftStr; 
  // Подписываемся на событие окончания таймера и реагируем на него сообщухой
  timer.CountDownFinished += () => MessageBox.Show("Timer finished the work!"); 
  timer.Start(); //стартуем
}

В самом классе CountDownTimer изменил метод TimeLeftStr

public string TimeLeftStr => this.TimeLeft.ToString("hh:mm:ss");

После идёт отсчёт: 12:00:59

Но этот код не работает:

CountDownTimer timer = new CountDownTimer();//создаем инстанс
timer.SetTime(1,0);

Не заменяет на нужное, всегда с 12 начинает.

Answer 1

Вам нужен вот такой формат для даты HH:mm:ss

READ ALSO
Как отобразить окно как диалог?

Как отобразить окно как диалог?

У меня есть подготовленное окно для показа диалога, но как дошло дело до его показа, я не понимаю как отобразить это окно как диалог

135
Как синхронизировать работу потока и основной программы, чтобы они не мешали друг другу?

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

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

141
Классы и дефолтная инициализация

Классы и дефолтная инициализация

В C# в структурах запрещено использовать конструктор без параметров, так как он используется для инициализации членов структуры (обнуления...

419
netcore 2.2 подключить стороннюю библиотеку на NetFramework 4.5.2

netcore 2.2 подключить стороннюю библиотеку на NetFramework 4.5.2

Для проекта на netcore 22 понадобилось использовать библиотеку скомпилированную под X86 NetFramework 4

152