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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top