WPF: Bouton simple clic + numéro double clic
-
13-09-2019 - |
Question
Je dois gérer à la fois le clic simple et le double clic d'un bouton dans une application WPF avec une réaction différente. Malheureusement, sur un double-clic, WPF déclenche deux événements clic et un double événement clic, il est donc difficile de gérer cette situation.
Il a essayé de le résoudre à l'aide d'une minuterie, mais sans succès ... J'espère que vous pouvez me aider.
Permet de voir le code:
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
}
Le problème est que le « ACTION SIMPLE CLIC » appelé après la « ACTION DU DOUBLE CLIC » sur doubleClick. Il est étrange que je mets thedoubleClickTimer
null double clic, mais dans le delayedBtnClick
il est vrai: O
Je l'ai déjà essayé d'utiliser plus de temps, un drapeau bool et serrure ...
Avez-vous des idées?
Best!
La solution
Si vous définissez la RoutedEvent
à e.Handled
après avoir manipulé l'événement true
alors il ne sera pas appeler l'événement MouseDoubleClick
la deuxième fois après la Click
du MouseDoubleClick
.
Il y a un post récent qui touche ayant des comportements différents pour SingleClick
et DoubleClick
qui peut être utile.
Cependant, si vous êtes sûr que vous voulez comportements distincts et que vous voulez / besoin de bloquer la première Click
ainsi que la deuxième Click
, vous pouvez utiliser la DispatcherTimer
comme vous étiez.
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");
}
Autres conseils
Vous pouvez essayer ceci:
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
}
}
Si nécessaire, vous auriez besoin clic de souris et d'attendre jusqu'à ce que la souris jusqu'à effectuer l'action.