WPF:Проблема с одним щелчком кнопки + двойным щелчком
-
13-09-2019 - |
Вопрос
Мне приходится обрабатывать как одиночный щелчок, так и двойной щелчок кнопки в приложении WPF с разной реакцией.К сожалению, при двойном нажатии WPF запускает событие two click и событие double click, поэтому с этой ситуацией сложно справиться.
Он пытался решить это с помощью таймера, но безуспешно...Я надеюсь, вы сможете мне помочь.
Давайте посмотрим на код:
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
}
Проблема в том, что "ДЕЙСТВИЕ с ОДНИМ ЩЕЛЧКОМ МЫШИ" вызывается после "ДЕЙСТВИЯ с ДВОЙНЫМ ЩЕЛЧКОМ МЫШИ" при doubleclick.Странно, что я установилdoubleClickTimer
обнулить при двойном щелчке, но в delayedBtnClick
это правда : О
Я уже пытался использовать более длительное время, флаг bool и блокировку...
У вас есть какие-нибудь идеи?
Лучший!
Решение
Если вы установите RoutedEvent
's 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
}
}
При необходимости вы могли бы потребовать щелчка мышью и подождать, пока мышь не поднимется, чтобы выполнить действие.