WPF: Botão único clique + questão de clique duplo
-
13-09-2019 - |
Pergunta
Eu tenho que lidar com ambos o único clique eo duplo clique de um botão em um aplicativo WPF com reação diferente. Infelizmente, em um duplo, WPF dispara dois eventos de clique e um evento de clique duplo, por isso é difícil de lidar com esta situação.
Ele tentou resolvê-lo usando um timer, mas sem sucesso ... Eu espero que você possa me ajudar.
Vamos ver o código:
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
}
O problema é que o 'CLICK única ação' chamado após o 'ação de duplo clique' na DoubleClick. É estranho que eu definir thedoubleClickTimer
como nulo em duplo clique, mas na delayedBtnClick
é verdade: O
Eu já tentei usar mais tempo, uma bandeira bool e bloqueio ...
Você tem alguma idéia?
Melhor!
Solução
Se você definir RoutedEvent
do e.Handled
para true
depois de manusear o evento MouseDoubleClick
então ele não vai chamar o evento Click
a segunda vez após a MouseDoubleClick
.
Há um recente post que toca em ter comportamentos diferentes para SingleClick
e DoubleClick
que pode ser útil.
No entanto, se você tem certeza que quer comportamentos distintos e quer / necessidade de bloquear o primeiro Click
, bem como o segundo Click
, você pode usar o DispatcherTimer
como se estivesse.
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");
}
Outras dicas
Você poderia tentar o seguinte:
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
}
}
Se neccessary, você poderia exigir clique do mouse e esperar até mouse para cima para executar a ação.