Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Expression Blend 3 таймер (Timer)


Автор: NOHEAD 2.6.2010, 19:06
Приветствую всех.
Делаю небольшое WPF приложение в Expression Blend 3.
В окне есть объект Grid с именем "UpPanel"
Вешаю на окно при MouseMove обработчик:
Код

private void mouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            UpPanel.Visibility=Visibility.Visible; 
                        
            myTimer.Elapsed += new ElapsedEventHandler( TimerStop );
            myTimer.Interval=1000;
            myTimer.Enabled = true; 
            myTimer.Start();
                    
        }

public void TimerStop(object source, ElapsedEventArgs e)
        {
            
            UpPanel.Visibility=Visibility.Hidden;
            MessageBox.Show("StopTimer");
            myTimer.Stop();
            
        }


В итоге при движении мышки включается таймер и после Одной Секунды должна пропадать UpPanel
 и выскакивать MessageBox.
Но ничего не происходит.
Но если я меняю местами строки в функции "TimerStop" и делаю так:
Код

public void TimerStop(object source, ElapsedEventArgs e)
        {
            MessageBox.Show("StopTimer");
            UpPanel.Visibility=Visibility.Hidden;
            myTimer.Stop();
            
        }

то MessageBox выскакивает, а панель так и не пропадает, и ошибка не вылезает никакая.
В итоге строка UpPanel.Visibility=Visibility.Hidden; (и всё что после неё) не срабатывает в функции TimerStop, 
но если её перенести в функцию "mouseMove", то она работает чётко.

Почему так, кто может объяснить?

Автор: NOHEAD 3.6.2010, 11:40
В общем решение найдено.
Класс System.Timers.Timer тупит, ну или я чего то не понимаю.

Помог другой таймер: System.Windows.Threading.DispatcherTimer;
Вот пример:

Код

using System.Windows.Threading;

public partial class MainWindow : Window
    {
                
        DispatcherTimer dispatcherTimer = new DispatcherTimer();

public MainWindow()
        {
                                    
            dispatcherTimer.Tick += new EventHandler(TimerStop);
                 dispatcherTimer.Interval = new TimeSpan(0, 0, 5);
            dispatcherTimer.Start();
          
        }

private void TimerStop(object sender, EventArgs e)
        {
            //Тут уже работает всё что угодно, даже UpPanel.Visibility=Visibility.Hidden;
            dispatcherTimer.Stop();
                        
        }

}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)