2017-01-17 6 views
0

Я пытаюсь зажать событие мыши с помощью PreviewMouseDown и DispatcherTimer следующим образом:Удерживая событие мыши в WPF

private void button_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
     dispatcherTimer.Interval = new TimeSpan(0, 0, 1); 
     dispatcherTimer.Start(); 
    } 

private void dispatcherTimer_Tick(object sender, EventArgs e) 
    { 
     _sec = _sec + 1; 
     if (_sec == 3) 
     { 
      dispatcherTimer.Stop(); 
      MessageBox.Show(_sec.ToString()); 
      _sec = 0; 
      return; 
     } 
    } 

Этот код работает, но первая мышь вниз занимает 3 секунды, чтобы отобразить сообщение, после того, что время, чтобы показать сообщение уменьшается (менее 3 секунд)

ответ

1

Второй раз это вызывается

dispatcherTimer.Tick += dispatcherTimer_Tick; // try without that new EventHandler(...) 

Вторая часть будет прикреплена. Итак, после первой секунды sec будет равно 2, так как событие вызывается дважды.

Вы можете попытаться уничтожить и установить значение null для переменной dispatcherTimer в PreviewMouseUp & создать новый экземпляр на PreviewMouseDown.

Или другой вариант был бы, на PreviewMouseUp, вы можете

dispatcherTimer.Tick -= dispatcherTimer_Tick; 
sec = 0; 

- = отключит обработчик события.

+0

Я пробовал это, но он не работает вообще после первого сообщения! –

+0

Можете ли вы показать, что вы пробовали? он должен работать, если вы повторно подключите обработчик событий. –

+0

Теперь это работа, спасибо за вашу помощь. –

1

Для этого вам не нужен DispatcherTimer. Вы можете обрабатывать события PreviewMouseDown и PreviewMouseUp.

См. Следующий пример кода.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     PreviewMouseDown += Window3_PreviewMouseDown; 
     PreviewMouseUp += Window3_PreviewMouseUp; 
    } 

    DateTime mouseDown; 
    private void Window3_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     mouseDown = DateTime.Now; 
    } 

    readonly TimeSpan interval = TimeSpan.FromSeconds(3); 
    private void Window3_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
    { 
     if (DateTime.Now.Subtract(mouseDown) > interval) 
      MessageBox.Show("Mouse was held down for > 3 seconds!"); 
     mouseDown = DateTime.Now; 
    } 
} 
+0

Спасибо за вашу помощь, мне нужен DispatcherTimer, чтобы уведомить пользователя о чем-то, см. Мой answe ниже. –