2013-09-19 2 views
1

У меня есть класс animateMyWindow для изменения непрозрачности открытого окна с помощью таймера.C# Timer thread crash, BeginInvoke

namespace POCentury 
{ 
    class animateMyWindow 
    { 
     Timer _timer1 = new Timer(); 
     Window _openedWindow = null; 
     public void animationTimerStart(object openedWindow) 
     { 
      if (openedWindow == null) 
      { 
       throw new Exception("Hata"); 
      } 
      else 
      { 
       _openedWindow = (Window)openedWindow; 
       _timer1.Interval = 1 * 25; 
       _timer1.Elapsed += new ElapsedEventHandler(animationStart); 
       _timer1.AutoReset = true; 
       _timer1.Enabled = true; 
       _timer1.Start(); 
      } 
     } 
     private void animationStart(object sender, ElapsedEventArgs e) 
     { 
      if (_openedWindow.Opacity == 1) 
       animationStop(); 
      else 
       _openedWindow.Opacity += .1; 
     } 
     private void animationStop() 
     { 
      _timer1.Stop(); 
     } 
    } 
} 

animationStart не может попасть в мое окно, потому что оно работает с другим потоком. Я пробовал Dispatcher.BeginInvoke и не могу заставить его работать. Можете ли вы помочь мне в этом?

+0

Если это WPF вы должны проверить http://www.codeproject.com/Articles/23257/Beginner-s-WPF-Animation-Tutorial Есть некоторые хорошие инструменты анимации внутри WPF –

+2

Вы бы избежать необходимо использовать Диспетчер, если вы будете использовать [DispatcherTimer] (http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx). Еще проще было бы полностью удалить материал таймера и оживить непрозрачность с помощью [DoubleAnimation] (http://msdn.microsoft.com/en-us/library/system.windows.media.animation.doubleanimation.aspx). – Clemens

+0

Спасибо @ Clemens, теперь он работает с DispatcherTimer. – cKNet

ответ

0

В принципе, вы не можете получить доступ к openedWindow внутри события animationStart, потому что это происходит в другой теме. Для этого нужен диспетчер.

Dispatcher.BeginInvoke(new Action(() => 
{ 
     if (_openedWindow.Opacity == 1) 
       animationStop(); 
      else 
       _openedWindow.Opacity += .1; 
})); 
+0

Dispatcher.BeginInvoke не работает. Он дает «Ошибка Ссылка на объект требуется для нестатического поля, метода или свойства ..» – cKNet

+0

Попробуйте 'Dispatcher.CurrentDispatcher.BeginInvoke (...)' –

+0

Я мог бы ответить на это, но вы почти провайдер полное решение. Если вы замените _Dispatcher.BeginInvoke_ на ** _ opensWindow.Dispatcher.BeginInvoke **, вы вызовете правильный диспетчер. У него есть проблема между Class 'Dispatcher' и свойством Window' Dispatcher' –