Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我想要双击时,如何避免单击?_C#_Events_Wpf Controls_Mvvm Light - Fatal编程技术网

C# 当我想要双击时,如何避免单击?

C# 当我想要双击时,如何避免单击?,c#,events,wpf-controls,mvvm-light,C#,Events,Wpf Controls,Mvvm Light,我有一个WPF应用程序和一个按钮。在这个Button中,我想要实现代码的click事件,但是我想要当do用鼠标双击时,执行其他代码,而不是click事件的代码 问题是click事件的代码总是被执行的,我不知道当我双击时是否有办法避免click事件的执行 我遵循MVVM模式,使用MVVM light将事件转换为命令 谢谢。在处理MouseDoubleClick事件后,将RoutedEvent的e.Handled设置为True,以阻止触发的第二次单击事件 如果要阻止首次单击事件行为,可以使用计时器:

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

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

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


谢谢。

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

在click事件中,您可以检查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.
        }
    }

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

是一个很好的解释,说明了如何区分单击和双击。它给出了两个如何实现这一点的示例。

我分享了这个解决方案,它是其他两个解决方案的混合。对不起,我不能给两个都提供公认的解决方案

如果我使用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
            }
        }
private void MouseClick_Tick(object sender, System.EventArgs e)
        {
            _dtrMouseClick.Stop();

            //code of the single click                
        }
此方法是链接到Dispatcher的方法,如果未在第二次单击鼠标时停止,则执行该方法

private void MouseLeftButtonDownCommand(MouseButtonEventArgs e)
        {

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

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

                //the code of the double click
            }
        }
private void MouseClick_Tick(object sender, System.EventArgs e)
        {
            _dtrMouseClick.Stop();

            //code of the single click                
        }
Dispatchermer是在视图模型的构造函数中创建的

_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();
间隔为250ms,即用户必须双击的时间间隔


在这个解决方案中,我使用相同的方法停止Dispatchermer,即stop()方法,但出于某种原因,如果我使用这两个事件(单击和mouseDoubleClick)Dispatchermer不会在双击中停止,如果我使用MouseLeftButtonDown事件,则解决方案有效。

您的按钮没有鼠标双击事件上的
吗?是的,我的按钮有两个事件,单击事件和鼠标双击事件。那么为什么不在那里的
onmouseboolkit
事件中编写要执行的代码呢?因为我需要两个不同的代码。如果用户单击一次,则为一个代码;如果用户双击,则为另一个用户。我需要区分用户何时执行一个或另一个操作。请查看我答案中的链接。它向您展示了如何区分普通单击和双击。基于此,您可以在单击和双击中使用所需的任何代码。但这不会触发首次单击事件吗?因为我认为问题在于,当我进行双击的第一次单击时,单击事件会触发,因为应用程序不知道我是否需要双击。使用此解决方案,当我实例化dispatcher时,dispatcher正在运行,当我实例化视图模型时,execute也在运行。是否有任何方法可以实例化处于停止状态的调度程序?如果我在视图模型的构造函数中而不是在变量类的声明中创建调度程序,并且在中间停止,则在创建视图模型时不执行调度程序。我有一个问题。如果dispatcher是静态的,我只能使用静态变量,但我需要使用视图模型的其他非静态属性。如果我将调度程序设置为非静态,则不会停止调度程序。我已经尝试过这种方法。问题是,如果我想触发事件,我需要使用MouseLeftDown的PreviewMouseLeftDown事件instad,因此我认为如果我使用PreviewEnvent,这段代码将无法工作。如果我使用MouseLeftDown,则不会触发事件。这有一个问题,即检测到双击,但first始终检测到第一次单击,因此始终执行单次单击的代码。稍后,如果再次单击,则执行双击代码。