4

I have an application in WPF and one button. In this buttun I want the click event that implement a code, but I want that when the do double click with the mouse, execute other code but not the code of the click event.

The problem is that the code of the click event is always executed and I don't know if there is a way to avoid the execution of the click event when I do doulbe click.

I am follow the MVVM pattern and I use MVVM light to convert the event into a command.

Thanks.

4

4 回答 4

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

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

于 2013-08-22T09:19:09.470 回答
2

是关于如何区分单击和双击的一个很好的解释。它为您提供了 2 个示例,说明如何实现这一目标。

于 2013-08-22T09:20:08.243 回答
2

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

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

private static DispatcherTimer myClickWaitTimer = 
    new DispatcherTimer(
        new TimeSpan(0, 0, 0, 0, 250), 
        DispatcherPriority.Normal, 
        mouseWaitTimer_Tick, 
        Dispatcher.CurrentDispatcher) { IsEnabled = false };

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");
}
于 2013-08-22T09:13:49.100 回答
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事件解决方案有效。

于 2013-08-24T11:01:02.320 回答