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 事件的剩余时间,它应该有效