WPF: кнопка с одним щелчком мыши + двойной щелчок

Я должен обрабатывать как один клик, так и двойной щелчок кнопки в приложении WPF с другой реакцией. К сожалению, при двойном щелчке WPF запускает событие с двумя щелчками и событие с двойным щелчком, поэтому трудно справиться с этой ситуацией.

Он пытался решить это с помощью таймера, но безуспешно … Надеюсь, вы можете мне помочь.

Посмотрим код:

private void delayedBtnClick(object statInfo) { if (doubleClickTimer != null) doubleClickTimer.Dispose(); doubleClickTimer = null; this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new VoidDelegate(delegate() { // ... DO THE SINGLE CLICK ACTION })); } private void btn_Click(object sender, RoutedEventArgs e) { if (doubleClickTimer == null) doubleClickTimer = new Timer(delayedBtnClick, null, System.Windows.Forms.SystemInformation.DoubleClickTime, Timeout.Infinite); } } } private void btnNext_MouseDoubleClick(object sender, MouseButtonEventArgs e) { if (doubleClickTimer != null) doubleClickTimer.Change(Timeout.Infinite, Timeout.Infinite); // disable it - I've tried it with and without this line doubleClickTimer.Dispose(); doubleClickTimer = null; //.... DO THE DOUBLE CLICK ACTION } 

Проблема в том, что «SINGLE CLICK ACTION» вызывается после двойного щелчка «DOUBLE CLICK ACTION». Странно, что я установил doubleClickTimer в null с двойным щелчком, но в delayedBtnClick это правда: O

Я уже пытался использовать более длительное время, флаг bool и блокировку …

У тебя есть идеи?

Лучший!

Если вы установите для параметра RoutedEvent e.Handled значение true после обработки события MouseDoubleClick он не будет вызывать событие Click во второй раз после MouseDoubleClick .

Есть недавняя публикация, в которой затрагиваются разные поведения для SingleClick и DoubleClick которые могут быть полезны.

Однако, если вы уверены, что хотите раздельное поведение и хотите / должны заблокировать первый Click а также второй Click , вы можете использовать DispatcherTimer как и вы.

 private static DispatcherTimer myClickWaitTimer = new DispatcherTimer( new TimeSpan(0, 0, 0, 1), DispatcherPriority.Background, mouseWaitTimer_Tick, Dispatcher.CurrentDispatcher); private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e) { // Stop the timer from ticking. myClickWaitTimer.Stop(); Trace.WriteLine("Double Click"); e.Handled = true; } private void Button_Click(object sender, RoutedEventArgs e) { myClickWaitTimer.Start(); } private static void mouseWaitTimer_Tick(object sender, EventArgs e) { myClickWaitTimer.Stop(); // Handle Single Click Actions Trace.WriteLine("Single Click"); } 

Вы можете попробовать следующее:

 Button.MouseLeftButtonDown += Button_MouseLeftButtonDown; private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { e.Handled = true; if (e.ClickCount > 1) { // Do double-click code } else { // Do single-click code } } 

Если необходимо, вы можете потребовать щелчок мыши и подождать, пока мышь не выйдет за действие.

  • Как определить, меняет ли текст TextBlock?
  • Как установить и изменить культуру в WPF
  • Вызывающий stream не может получить доступ к этому объекту, потому что ему принадлежит другой stream. WPF
  • Проблема с разрешением экрана в WPF?
  • Нажатие свойств GUI только для чтения обратно в ViewModel
  • Разница между TargetType = "controlType" и TargetType = "{x: Тип controlType}"
  • Изменение вида для ViewModel
  • Как включить внешний шрифт в приложение WPF без его установки
  • Имя не существует в ошибке пространства имен в XAML
  • Глобальные исключения исключений в приложении WPF?
  • Что означает «{Binding Path =.}» В привязке WPF?
  • Давайте будем гением компьютера.