使用计时器停止另一个计时器

3

我是一个C#业余爱好者,正在做一个项目。

我使用了3个计时器,其中一个是20秒的轮换计时器。 我希望在20秒过后,另外的两个计时器都停止。

我无法从轮换计时器中访问/调用另外两个计时器。 下面是代码:

public void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{            
    DispatcherTimer tgtTimer = new DispatcherTimer();
    tgtTimer.Tick += new EventHandler(tgtTimer_tick);
    tgtTimer.Interval = new TimeSpan(0, 0, 3);
    tgtTimer.Start();


    DispatcherTimer txbTimer2 = new DispatcherTimer();
    txbTimer2.Tick += new EventHandler(txbTimer2_tick);
    txbTimer2.Interval = new TimeSpan(0, 0, 0, 4, 000);
    txbTimer2.Start();

    DispatcherTimer rt = new DispatcherTimer();
    rt.Tick += new EventHandler(rt_tick);
    rt.Interval = new TimeSpan(0, 0, 1);
    rt.Start();
}

private void tgtTimer_tick(object sender, EventArgs e)
{ //some code }

private void txbTimer2_tick(object sender, EventArgs e)
{ //some code }

int i = 20 //for the 20 sec round timer

private void rt_tick(object sender, EventArgs e) //round timer
{
    if(i!=0)
    { 
        i--;
        txbTime.Text = "";
        txbTime.Text = Convert.ToString(i) + "s";
    }
    else 
    {
        this.Opacity = 0.3;  

        //tgtTimer and txbTimer2 can't be accessed from here          
    }             
}            

我该如何停止这两个计时器?

1
你需要引用那些计时器。最简单的方法是在你的对象上有字段,你可以将计时器对象分配给这些字段,而不是将它们作为方法中的局部变量。 - Chris
将此代码移出按钮点击事件:DispatcherTimer tgtTimer = new DispatcherTimer(); 或者您可以内联这些计时器的方法以保持其作用域。 - Stephen Brickner
1
如果(i != 0),这将降低你的“i”变量,即使当i小于0时,我也不确定你是否想要这样。也许改为i < 0。 - QuestionsEverywhere
2个回答

2
您应该尝试在mouseleftbutton down事件之外添加计时器,像这样:

        DispatcherTimer tgtTimer = new DispatcherTimer();
        DispatcherTimer txbTimer2 = new DispatcherTimer();
        DispatcherTimer rt = new DispatcherTimer();


public void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {            
        tgtTimer.Tick += new EventHandler(tgtTimer_tick);
        tgtTimer.Interval = new TimeSpan(0, 0, 3);
        tgtTimer.Start();



        txbTimer2.Tick += new EventHandler(txbTimer2_tick);
        txbTimer2.Interval = new TimeSpan(0, 0, 0, 4, 000);
        txbTimer2.Start();


        rt.Tick += new EventHandler(rt_tick);
        rt.Interval = new TimeSpan(0, 0, 1);
        rt.Start();
    }

2

将定时器的引用从按钮点击事件中移出:

DispatcherTimer tgtTimer = new DispatcherTimer();
DispatcherTimer tgtTimer2 = new DispatcherTimer();

public void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{            
        DispatcherTimer tgtTimer = new DispatcherTimer(); //here
        tgtTimer.Tick += new EventHandler(tgtTimer_tick);
        tgtTimer.Interval = new TimeSpan(0, 0, 3);
        tgtTimer.Start();


        DispatcherTimer txbTimer2 = new DispatcherTimer(); //and here
        txbTimer2.Tick += new EventHandler(txbTimer2_tick);
        txbTimer2.Interval = new TimeSpan(0, 0, 0, 4, 000);
        txbTimer2.Start();

        //or inline the method to stay within scope
        DispatcherTimer rt = new DispatcherTimer();
        rt.Tick += (ob, ev) =>
        {
              //still in scope
              txbTimer2.Start();
        };
        rt.Interval = new TimeSpan(0, 0, 1);
        rt.Start();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接