WPF: кнопка с одним щелчком мыши + двойной щелчок
Я должен обрабатывать как один клик, так и двойной щелчок кнопки в приложении WPF с другой реакцией. К сожалению, при двойном щелчке WPF запускает событие с двумя щелчками и событие с двойным щелчком, поэтому трудно справиться с этой ситуацией.
Он пытался решить это с помощью таймера, но безуспешно … Надеюсь, вы можете мне помочь.
Посмотрим код:
- Есть ли ansible чит-лист WPF?
- Изменение цвета ячейки DataGrid на основе значений
- WPF ListView - обнаружение, когда выбран выбранный элемент
- Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher
- WPF: Есть ли способ переопределить часть ControlTemplate без переопределения всего стиля?
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 и блокировку …
У тебя есть идеи?
Лучший!
- Как я могу создать «предварительный просмотр» FlowDocument в приложении WPF?
- Закрыть окно из ViewModel
- Синхронизированная прокрутка двух ScrollViewer, когда любой прокручивается в wpf
- Доступ к переменной codebehind в XAML
- WPF Binding - значение по умолчанию для пустой строки
- Хорошая или плохая практика для Dialogs в wpf с MVVM?
- Как WPF UserControl наследует WPC UserControl?
- Как установить ViewModel в окне в XAML с использованием свойства DataContext?
Если вы установите для параметра 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 } }
Если необходимо, вы можете потребовать щелчок мыши и подождать, пока мышь не выйдет за действие.