СОВЕТЫ
Если вы хотите сделать это самостоятельно, вместо использования существующего класса StopWatch
, другим вариантом будет отслеживание времени запуска секундомера (start
) и как долго работает секундомер (elapsed
).
С помощью значения start
мы можем вычислить время elapsed
в событии таймера Tick
, например:
// elapsed is a TimeSpan object
elapsed = DateTime.Now - start;
Если мы добавим возможность останавливать секундомер и затем запускать его снова (не сбрасывая), мы должны учитывать это «время простоя». Мы можем сделать это в нашем событии нажатия кнопки Start
, вычитая время elapsed
из текущего времени и используя это значение в качестве времени начала:
// start is a DateTime object
start = DateTime.Now.Subtract(elapsed);
Затем, когда мы хотим отобразить истекшее время для пользователя, мы можем просто использовать наше поле elapsed
и отформатировать его следующим образом: hours:minutes:seconds.milliseconds
, используя строку пользовательского формата.
// I noticed you're doing a countdown timer, so we want to display the difference
// between the original duration of 30 minutes and the elapsed time we've been running
lblStopwatch.Text = (duration - elapsed).ToString("hh\\:mm\\:ss\\.ff");
ОТВЕТ
Если этих подсказок недостаточно, вот пример проекта, использующего эту стратегию:
public partial class Form1 : Form
{
private DateTime _startTime;
private TimeSpan _elapsedTime;
// The starting duration for the countdown timer
private readonly TimeSpan _duration = TimeSpan.FromMinutes(30);
public Form1()
{
InitializeComponent();
ResetTimer();
}
private void ResetTimer()
{
_startTime = DateTime.Now;
_elapsedTime = TimeSpan.Zero;
UpdateStopwatchDisplay();
}
private void UpdateStopwatchDisplay()
{
// Display the current duration to the user
lblStopwatch.ForeColor = timer1.Enabled ? Color.RoyalBlue : Color.DarkGray;
lblStopwatch.Text = (_duration - _elapsedTime).ToString("hh\\:mm\\:ss\\.ff");
}
private void btnStart_Click(object sender, EventArgs e)
{
// Subtract 'elapsed' from 'now' to account for any stoppage time
_startTime = DateTime.Now.Subtract(_elapsedTime);
UpdateStopwatchDisplay();
timer1.Start();
}
private void btnStop_Click(object sender, EventArgs e)
{
timer1.Stop();
UpdateStopwatchDisplay();
}
private void btnReset_Click(object sender, EventArgs e)
{
ResetTimer();
}
private void timer1_Tick(object sender, EventArgs e)
{
// Update elapsed time
_elapsedTime = DateTime.Now.Subtract(_startTime);
// Stop the timer if we've reached our duration
if (_elapsedTime >= _duration)
{
_elapsedTime = _duration;
timer1.Stop();
}
UpdateStopwatchDisplay();
}
}