2015-12-15 3 views
2

Я любитель для C#, и я делаю проект.Использование таймера для остановки другого таймера

Я использовал 3 таймера, где один таймер с 20 секундами. Я хочу, чтобы через 20 секунд остальные 2 таймера должны были остановиться

Я не могу получить доступ к другим 2 таймерам из круглого таймера. Вот код:

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   
    }    
}    

Как должен я остановить 2 таймеры?

+1

Вам нужен рефери к тем таймерам. Самый простой способ сделать это - иметь поля на объекте, которые вы назначаете своим объектам таймера, а не использовать их в качестве локальных переменных в методе. – Chris

+0

Переместите это из кнопки: DispatcherTimer tgtTimer = new DispatcherTimer(); Или вы можете встроить методы для тех таймеров, которые останутся в сфере охвата. –

+1

if (i! = 0), это уменьшит вашу переменную «i», когда i будет ниже 0. Я не уверен, хотите ли вы этого. Может быть, измените его на i <0 – QuestionsEverywhere

ответ

2

Вы должны попытаться добавить таймеры вне mouseleftbutton вниз события, как это:

 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(); 
    } 
+0

спасибо доге: v –

+0

вы очень приветствуетесь дорогой cate –

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(); 
}