2013-11-29 3 views
0

У меня есть этот прослушиватель событий, используя WPF и C#. То, что я делаю, это просто изменение цвета определенных кнопок. Я меняю цвет одного, а затем перехожу к следующему. Проблема в том, что я пытаюсь сделать ее интерактивной и изменить цвет, используя разные времена, в зависимости от значения ползунка, который у меня есть в моем XAML. Проблема в том, что когда я перезапускаю игру более 3 раз, таймер начинает игнорировать значения ползунка, а цвета кнопок меняются с помощью шаблона, который не соответствует тому, что на слайдере. Любые предложения?dispatcherTimer не работает в WPF

private void Restart_Click(object sender, RoutedEventArgs e) 
    { 

     SnackBoxes = 2; 
     theBabies[0] = new Baby(); 
     theBabies[1] = new Baby(); 
     theBabies[2] = new Baby(); 
     theBabies[3] = new Baby(); 
     theBabies[4] = new Baby(); 
     theBabies[5] = new Baby(); 
     theBabies[6] = new Baby(); 
     theBabies[7] = new Baby(); 
     theBabies[8] = new Baby(); 
     theBabies[9] = new Baby(); 
     resetBabies(); 
     dispatcherTimer1 = new DispatcherTimer(); 
     int timeSlider = (int)(11 - theSlider.Value); 
     MessageBox.Show(""+timeSlider); 
     dispatcherTimer1.Interval = TimeSpan.FromSeconds(timeSlider); 
     dispatcherTimer1.Tick += delegate 
     { 
      int nextBabyRed = nextBabyToTurnRed(theBabies); 

      switch (nextBabyRed) 
      { 
       case 0: 
        Baby1.Background = Brushes.Red; 
        theBabies[0].Happy = false; 
        break; 
       case 1: 
        Baby2.Background = Brushes.Red; 
        theBabies[1].Happy = false; 
        break; 
       case 2: 
        Baby3.Background = Brushes.Red; 
        theBabies[2].Happy = false; 
        break; 
       case 3: 
        Baby4.Background = Brushes.Red; 
        theBabies[3].Happy = false; 
        break; 
       case 4: 
        Baby5.Background = Brushes.Red; 
        theBabies[4].Happy = false; 
        break; 
       case 5: 
        Baby6.Background = Brushes.Red; 
        theBabies[5].Happy = false; 
        break; 
       case 6: 
        Baby7.Background = Brushes.Red; 
        theBabies[6].Happy = false; 
        break; 
       case 7: 
        Baby8.Background = Brushes.Red; 
        theBabies[7].Happy = false; 
        break; 
       case 8: 
        Baby9.Background = Brushes.Red; 
        theBabies[8].Happy = false; 
        break; 
       case 9: 
        Baby10.Background = Brushes.Red; 
        theBabies[9].Happy = false; 
        break; 
       default: 
        Console.WriteLine("Default case"); 
        break; 
      } 

      //dispatcherTimer1.Stop(); 
     }; 
     dispatcherTimer1.Start(); 
     //MessageBox.Show(""+theSlider.Value); 
    } 
} 

ответ

1

Вместо того, чтобы создавать новый таймер каждый раз, просто измените интервал.

Таким образом, вместо:

dispatcherTimer1 = new DispatcherTimer(); 
    int timeSlider = (int)(11 - theSlider.Value); 
    MessageBox.Show(""+timeSlider); 
    dispatcherTimer1.Interval = TimeSpan.FromSeconds(timeSlider); 
    dispatcherTimer1.Tick += delegate 

У dispatchTimer объявленных на внешнюю области, и создана, но остановился. Перемещение делегата из обработчика в Click в свой собственный метод:

private void DispatchTimerClick(...) 
{ 
    // ... 
} 

И крючок, что обработчик события вверх, когда таймер изначально создается в форме.

Затем ваш обработчик щелчка становится:

int timeSlider = (int)(11 - theSlider.Value); 
    MessageBox.Show(""+timeSlider); 
    dispatcherTimer1.Interval = TimeSpan.FromSeconds(timeSlider); 
    dispatcherTimer1.Start(); 

Start не действительно необходимо здесь, если вы не остановили его каким-то образом (или если он не был запущен).

1

"dispatcherTimer1 = new DispatcherTimer();"

В чем проблема, я думаю. Вы создаете новые таймеры, но старые все равно будут работать.

Попробуйте остановить старые таймеры перед созданием новых.

Смежные вопросы