WPF C# - 定时器倒计时

时间:2013-08-14 11:30:48

标签: c# wpf timer dispatchertimer

如何在用WPF C#编写的代码中实现以下内容?

我有一个ElementFlow控件,我在其中实现了一个SelectionChanged事件,当控件的项目选择发生变化时(根据定义)会触发一个特定的事件。

我希望它能做的是:

  1. 启动计时器
  2. 如果计时器达到2秒,则启动一个MessageBox(例如“Hi there”),例如
  3. 如果选择在计时器达到2秒之前发生变化,则应重置计时器并重新开始计时。
  4. 这是为了确保只有在2秒内选择没有改变才会启动冗长的操作但是我不熟悉WPF的DispatcherTimer功能,因为我对Windows窗体的正常计时器的了解更多

    谢谢,

    S上。

4 个答案:

答案 0 :(得分:4)

我已经确定了完整的代码:

DispatcherTimer _timer;

public MainWindow()
{
    _myTimer = new DispatcherTimer();
    _myTimer.Tick += MyTimerTick;
    _myTimer.Interval = new TimeSpan(0,0,0,1);
}

private void ElementFlowSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    _counter = 0;
    _myTimer.Stop();
    _myTimer.Interval = new TimeSpan(0, 0, 0, 1);
    _myTimer.Start();
}

private int _counter;
public int Counter
{
    get { return _counter; }
    set
        {
            _counter = value;
            OnPropertyChanged("Counter");
        }
}
private void MyTimerTick(object sender, EventArgs e)
{
    Counter++;
    if (Counter == 2)
    {
        _myTimer.Stop();
        MessageBox.Show(“Reached the 2 second countdown”);
    }
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
    PropertyChangedEventHandler e = PropertyChanged;
    if (e != null)
        {
            e(this, new PropertyChangedEventArgs(propertyName));
}
}

答案 1 :(得分:3)

试试这个:

private int timerTickCount = 0;
private bool hasSelectionChanged = false;
private DispatcherTimer timer;

在构造函数或相关方法中:

timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 1); // will 'tick' once every second
timer.Tick += new EventHandler(Timer_Tick);
timer.Start();

然后是一个事件处理程序:

private void Timer_Tick(object sender, EventArgs e)
{
    DispatcherTimer timer = (DispatcherTimer)sender;
    if (++timerTickCount == 2)
    {
        if (hasSelectionChanged) timer.Stop();
        else MessageBox.Show("Hi there");
    }
}

最后,为了完成这项工作,您只需根据hasSelectionChanged事件更改选择时设置SelectionChanged变量。

答案 2 :(得分:1)

看这里是如何使用DispatherTimer的代码,你可以在其中添加自己的逻辑。这取决于你..

 private void ListBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
    {
        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromMilliseconds(2000);
        timer.Tick += timer_Tick;
        timer.Start();

    }

    void  timer_Tick(object sender, object e)
    {
       // show your message here..
    }

答案 3 :(得分:1)

使用DispatcherTimer:

    private DispatcherTimer _timer;
    public void StartTimer()
    {
        if (_timer == null)
        {
            _timer = new DispatcherTimer();
            _timer.Tick += _timer_Tick;
        }

        _timer.Interval = TimeSpan.FromSeconds(2);
        _timer.Start();
    }

    void _timer_Tick(object sender, EventArgs e)
    {
        MessageBox.Show("Hi there");
        _timer.Stop();
    }

    void SelectionChangedEvent()
    {
        StartTimer();
    }