C# 向计时器添加分钟 (WPF/XAML)
C# add minutes to timer (WPF/XAML)
需要一些帮助。从其他站点用户那里拿了一个计时器,效果很好,但是我需要添加按钮(方法)来增加计时器打开时的时间。试过这个,但它不起作用。当程序运行时,我按下按钮,时间似乎增加了,但在同一毫秒内,它 returns 到了它的位置。即使您在启动时增加计时器开始前的时间,它也会被重置。请帮助
public partial class MainWindow : Window, INotifyPropertyChanged
{
//for timer
private DateTime _startCountdown; // time start
private TimeSpan _startTimeSpan = TimeSpan.FromMinutes(10); // start time until the end of the timer
private TimeSpan _timeToEnd; // time to stop. Changes when timer is on
private TimeSpan _interval = TimeSpan.FromMilliseconds(15); // interval
private DateTime _pauseTime;
//for additional time
private TimeSpan _plusOneMinute = TimeSpan.FromMinutes(1);
private TimeSpan _plusTwoMinutes = TimeSpan.FromMinutes(2);
private DispatcherTimer _timer;
public MainWindow()
{
InitializeComponent();
_timer = new DispatcherTimer();
_timer.Interval = _interval;
_timer.Tick += delegate
{
var now = DateTime.Now;
var elapsed = now.Subtract(_startCountdown);
TimeToEnd = _startTimeSpan.Subtract(elapsed);
};
StopTimer();
releaseButton.IsEnabled = false;
pauseButton.IsEnabled = false;
}
//methods for work with timer(buttons)
public TimeSpan TimeToEnd
{
get
{
return _timeToEnd;
}
set
{
_timeToEnd = value;
if (value.TotalMilliseconds <= 0)
{
StopTimer();
MessageBox.Show(winnerName, "we have a winner!");
lotesView.Clear();
lotes.Clear();
}
OnPropertyChanged("StringCountdown");
}
}
public string StringCountdown
{
get
{
var frmt = TimeToEnd.Minutes < 1 ? "ss\.ff" : "mm\:ss";
return _timeToEnd.ToString(frmt);
}
}
public bool TimerIsEnabled
{
get { return _timer.IsEnabled; }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
private void StopTimer()
{
if (TimerIsEnabled)
_timer.Stop();
TimeToEnd = _startTimeSpan;
}
private void PlusOneMinute()//doesn't work
{
TimeToEnd = TimeToEnd + _plusOneMinute;
}
private void PlusTwoMinutes()//doesn't work
{
TimeToEnd = TimeToEnd + _plusTwoMinutes;
}
private void StartTimer(DateTime sDate)
{
_startCountdown = sDate;
_timer.Start();
}
private void PauseTimer()
{
_timer.Stop();
_pauseTime = DateTime.Now;
}
private void ReleaseTimer()
{
var now = DateTime.Now;
var elapsed = now.Subtract(_pauseTime);
_startCountdown = _startCountdown.Add(elapsed);
_timer.Start();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
StartTimer(DateTime.Now);
pauseButton.IsEnabled = true;
startButton.IsEnabled = false;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
StopTimer();
pauseButton.IsEnabled = false;
releaseButton.IsEnabled = false;
startButton.IsEnabled = true;
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
PauseTimer();
pauseButton.IsEnabled = false;
releaseButton.IsEnabled = true;
}
private void Button_Click_3(object sender, RoutedEventArgs e)
{
ReleaseTimer();
releaseButton.IsEnabled = false;
pauseButton.IsEnabled = true;
}
private void Button_Click_PlusOne(object sender, RoutedEventArgs e)
{
PlusOneMinute();
}
private void Button_Click_PlusTwo(object sender, RoutedEventArgs e)
{
PlusTwoMinutes();
}
}
它不起作用,因为计算结束时间的部分是您的 .Thick 实现
_timer.Tick += delegate
{
var now = DateTime.Now;
var elapsed = now.Subtract(_startCountdown);
TimeToEnd = _startTimeSpan.Subtract(elapsed);
};
当您更改 TimeToEnd 变量时,它会在下一个滴答事件时再次更改。
您可以像这样更改时间的添加:
private void PlusOneMinute()//doesn't work
{
_startCountdown += _plusOneMinute;
}
private void PlusTwoMinutes()//doesn't work
{
TimeToEnd += _plusTwoMinutes;
}
通过这种方式,您将更改 Tick 事件的剩余时间,它应该有效
需要一些帮助。从其他站点用户那里拿了一个计时器,效果很好,但是我需要添加按钮(方法)来增加计时器打开时的时间。试过这个,但它不起作用。当程序运行时,我按下按钮,时间似乎增加了,但在同一毫秒内,它 returns 到了它的位置。即使您在启动时增加计时器开始前的时间,它也会被重置。请帮助
public partial class MainWindow : Window, INotifyPropertyChanged
{
//for timer
private DateTime _startCountdown; // time start
private TimeSpan _startTimeSpan = TimeSpan.FromMinutes(10); // start time until the end of the timer
private TimeSpan _timeToEnd; // time to stop. Changes when timer is on
private TimeSpan _interval = TimeSpan.FromMilliseconds(15); // interval
private DateTime _pauseTime;
//for additional time
private TimeSpan _plusOneMinute = TimeSpan.FromMinutes(1);
private TimeSpan _plusTwoMinutes = TimeSpan.FromMinutes(2);
private DispatcherTimer _timer;
public MainWindow()
{
InitializeComponent();
_timer = new DispatcherTimer();
_timer.Interval = _interval;
_timer.Tick += delegate
{
var now = DateTime.Now;
var elapsed = now.Subtract(_startCountdown);
TimeToEnd = _startTimeSpan.Subtract(elapsed);
};
StopTimer();
releaseButton.IsEnabled = false;
pauseButton.IsEnabled = false;
}
//methods for work with timer(buttons)
public TimeSpan TimeToEnd
{
get
{
return _timeToEnd;
}
set
{
_timeToEnd = value;
if (value.TotalMilliseconds <= 0)
{
StopTimer();
MessageBox.Show(winnerName, "we have a winner!");
lotesView.Clear();
lotes.Clear();
}
OnPropertyChanged("StringCountdown");
}
}
public string StringCountdown
{
get
{
var frmt = TimeToEnd.Minutes < 1 ? "ss\.ff" : "mm\:ss";
return _timeToEnd.ToString(frmt);
}
}
public bool TimerIsEnabled
{
get { return _timer.IsEnabled; }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
private void StopTimer()
{
if (TimerIsEnabled)
_timer.Stop();
TimeToEnd = _startTimeSpan;
}
private void PlusOneMinute()//doesn't work
{
TimeToEnd = TimeToEnd + _plusOneMinute;
}
private void PlusTwoMinutes()//doesn't work
{
TimeToEnd = TimeToEnd + _plusTwoMinutes;
}
private void StartTimer(DateTime sDate)
{
_startCountdown = sDate;
_timer.Start();
}
private void PauseTimer()
{
_timer.Stop();
_pauseTime = DateTime.Now;
}
private void ReleaseTimer()
{
var now = DateTime.Now;
var elapsed = now.Subtract(_pauseTime);
_startCountdown = _startCountdown.Add(elapsed);
_timer.Start();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
StartTimer(DateTime.Now);
pauseButton.IsEnabled = true;
startButton.IsEnabled = false;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
StopTimer();
pauseButton.IsEnabled = false;
releaseButton.IsEnabled = false;
startButton.IsEnabled = true;
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
PauseTimer();
pauseButton.IsEnabled = false;
releaseButton.IsEnabled = true;
}
private void Button_Click_3(object sender, RoutedEventArgs e)
{
ReleaseTimer();
releaseButton.IsEnabled = false;
pauseButton.IsEnabled = true;
}
private void Button_Click_PlusOne(object sender, RoutedEventArgs e)
{
PlusOneMinute();
}
private void Button_Click_PlusTwo(object sender, RoutedEventArgs e)
{
PlusTwoMinutes();
}
}
它不起作用,因为计算结束时间的部分是您的 .Thick 实现
_timer.Tick += delegate
{
var now = DateTime.Now;
var elapsed = now.Subtract(_startCountdown);
TimeToEnd = _startTimeSpan.Subtract(elapsed);
};
当您更改 TimeToEnd 变量时,它会在下一个滴答事件时再次更改。 您可以像这样更改时间的添加:
private void PlusOneMinute()//doesn't work
{
_startCountdown += _plusOneMinute;
}
private void PlusTwoMinutes()//doesn't work
{
TimeToEnd += _plusTwoMinutes;
}
通过这种方式,您将更改 Tick 事件的剩余时间,它应该有效