WPF:按住单击+双击问题

时间:2009-06-09 17:33:55

标签: wpf timer mouseclick-event

我必须处理单击和双击WPF应用程序中的按钮并进行不同的反应。 不幸的是,在双击时,WPF会触发两次点击事件和双击事件,因此很难处理这种情况。

它试图用计时器解决它但没有成功......我希望你能帮助我。

让我们看看代码:

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
}

问题是双击时“双击”动作后调用“单击动作”。奇怪的是,我在双击时将doubleClickTimer设置为null,但在delayedBtnClick中它是真的:O

我已经尝试使用更长的时间,一个布尔旗并锁定......

你有什么想法吗?

最佳!

2 个答案:

答案 0 :(得分:16)

如果您在处理RoutedEvent事件后将e.Handled的{​​{1}}设置为true,那么它将不会在第二次调用MouseDoubleClick事件后Click

recent post涉及MouseDoubleClickSingleClick的不同行为,可能会有用。

但是,如果您确定需要单独的行为并希望/需要阻止第一个DoubleClick以及第二个Click,则可以像使用Click一样使用DispatcherTimer

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");
}

答案 1 :(得分:6)

你可以试试这个:

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
    }
}

如有必要,您需要点击鼠标并等到鼠标向上执行操作。