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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top