当我想要双击时如何避免点击?

时间:2013-08-22 09:07:24

标签: c# events wpf-controls mvvm-light

我在WPF中有一个应用程序和一个按钮。在这个buttun中,我想要实现代码的click事件,但是我希望当用鼠标双击时,执行其他代码而不是click事件的代码。

问题是click事件的代码总是被执行,我不知道当我进行doulbe点击时是否有办法避免执行click事件。

我遵循MVVM模式,并使用MVVM灯将事件转换为命令。

感谢。

4 个答案:

答案 0 :(得分:3)

在点击事件中,您可以检查EventArgs中的点击次数,例如;

private void RightClickDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ClickCount == 1)
        {
            //do single click work here.
        }
        if (e.ClickCount == 2)
        {
            //do double click work.
        }
    }

这意味着您可以手动区分单击和双击,如果这是您想要的。

答案 1 :(得分:2)

在处理MouseDoubleClick事件后,将RoutedEvent的e.Handled设置为True,以阻止被点击的第二次点击事件。

如果要阻止首次单击事件行为,可以使用计时器:

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

答案 2 :(得分:2)

Here是如何区分点击次数和双击次数的一个很好的解释。它为您提供了如何实现这一目标的2个示例。

答案 3 :(得分:0)

我分享了这个解决方案,这是两个其他解决方案之间的混合。我不能给两者都接受的解决方案,对不起。

如果我使用PreviewMouseLeftButtonDown控制何时单击或双击工作,而不是使用两个事件(单击和双击)。

所以我用这段代码解决了这个问题:

第一种方法用鼠标控制点击。

private void MouseLeftButtonDownCommand(MouseButtonEventArgs e)
        {

            if (e.ClickCount == 1)
            {
                _dtMouseClick.Start();
            }

            else if(e.ClickCount > 1)
            {
                _dtMouseClick.Stop();

                //the code of the double click
            }
        }

此方法是链接到DispatcherTimer的方法,如果第二次单击鼠标时没有停止,则执行该方法。

private void MouseClick_Tick(object sender, System.EventArgs e)
        {
            _dtrMouseClick.Stop();

            //code of the single click                
        }

dispatcherTimer是在视图模型

的构造函数中创建的
_dtBotonBuscarMouseClick =
                new System.Windows.Threading.DispatcherTimer(
                new TimeSpan(0, 0, 0, 0, 250),
                System.Windows.Threading.DispatcherPriority.Background,
                MouseClick_Tick,
                System.Windows.Threading.Dispatcher.CurrentDispatcher);
            _dtMouseClick.Stop();

间隔为250毫秒,即用户必须双击的时间间隔。

在这个解决方案中,我使用相同的方法来停止dispatcherTimer,stop()方法,但由于某种原因,如果我使用这两个事件(click和mouseDoubleClick),则双击中不会停止dispatcherTimer,如果我使用MouseLeftButtonDown事件,解决方案可以正常工作。