WPF: Button Klick + Doppelklick Ausgabe
-
13-09-2019 - |
Frage
Ich habe zu behandeln sowohl den einzigen Klick und den Doppelklick auf eine Schaltfläche in einer WPF-Anwendung mit unterschiedlichen Reaktions. Leider auf einem Doppelklick, WPF feuert zwei Klick-Ereignis und ein Doppel-Klick-Ereignis, so ist es schwer, mit dieser Situation zu umgehen.
Sie versuchte es mit einem Timer zu lösen, aber ohne Erfolg ... Ich hoffe, dass Sie mir helfen können.
Hier können Sie den Code finden Sie unter:
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
}
Das Problem ist, dass die nach der ‚DOPPELKLICKEN ACTION‘ genannt ‚SINGLE CLICK ACTION‘ auf Doppelklick. Es ist seltsam, dass ich thedoubleClickTimer
auf null auf Doppelklick gesetzt, aber in der delayedBtnClick
es ist wahr: O
Ich habe schon versucht, längere Zeit zu verwenden, einen Bool-Flag und Schloss ...
Haben Sie irgendwelche Ideen?
Best!
Lösung
Wenn Sie die RoutedEvent
des e.Handled
auf true
nach der MouseDoubleClick
Event-Handling, dann wird es nicht das Click
Ereignis zum zweiten Mal nach dem MouseDoubleClick
nennen.
Es gibt eine kürzlich erschienenen Beitrag die auf berührt mit unterschiedlichen Verhaltensweisen für SingleClick
und DoubleClick
die nützlich sein können.
Wenn Sie jedoch sicher sind Sie separate Verhalten und wollen / müssen die erste Click
sowie der zweiten Click
blockieren, können Sie die DispatcherTimer
verwenden, wie Sie waren.
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");
}
Andere Tipps
Sie könnten versuchen, diese:
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
}
}
Falls nötig, würden Sie per Mausklick erfordern und bis Maus warten bis die Aktion auszuführen.