首页 新闻 会员 周边

关于C#的单击和双击的区别

0
悬赏园豆:10 [已解决问题] 解决于 2024-02-29 15:59

如题,如何在Mouse_Down里区分鼠标单击和双击?我这个代码双击的时候还是单击了先。找了度娘,有微软的回复:https://learn.microsoft.com/zh-cn/dotnet/desktop/winforms/how-to-distinguish-between-clicks-and-double-clicks?view=netframeworkdesktop-4.8&redirectedfrom=MSDN

 

请给出具体的代码,能够区分单击和双击的不同操作。

private DateTime sClickTime = DateTime.MinValue;
private DateTime sCloseTime = DateTime.MinValue;

private void NILzhdimSoft_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {                
        var clickTime = (DateTime.Now - sClickTime).TotalMilliseconds;
        if (clickTime < SystemInformation.DoubleClickTime)
        {
            //如果是双击
            if (Windows.Instance.PlugInOPForm == null)
            {
                Windows.Instance.PlugInOPForm = new WndPlugInOP();
            }
            Windows.Instance.PlugInOPForm.ShowPlugInMgrForm();
        }
        else
        {
            //如果是单击
            sClickTime = DateTime.Now;
            if ((sClickTime - sCloseTime).TotalMilliseconds > 300)
            {
                if (Windows.Instance.DefaultForm.Visible)
                {
                    ShowWindowMgr.ShowWindow(Windows.Instance.DefaultForm, WindowsState.Hide);
                }
                else
                {
                    ShowWindowMgr.ShowWindow(Windows.Instance.DefaultForm, WindowsState.RunningShow);
                }
                sCloseTime = DateTime.Now;
            }                    
        }
    }
}
C#
lzhdim的主页 lzhdim | 小虾三级 | 园豆:642
提问于:2024-02-05 20:54
< >
分享
最佳答案
0

不太理解你的使用常见,为什么不订阅Click和DoubleClick事件呢?哦,你需要对一个按钮进行单击和双击进行两种不同的处理逻辑对吧。
我没有遇到过这样的场景,但是还是说下我的想法,希望可以帮到你。

  • 最简单的方案,分成两个button,分别响应
  • 一个按钮的情况下,鼠标动作的MouseEventArgs有一个clicks用于获取按下并释放鼠标按钮的次数,不知可行不可行,你可以试一下通过clicks是否可以区分单击还是双击
    • 或者单击采用MouseDown事件响应,双击采用DoubleClick,在各自的事件中通过clicks判断是否触发的正确
收获园豆:10
MonoiF | 菜鸟二级 |园豆:282 | 2024-02-08 11:33

就是想区分单击和双击,,,Winform窗体的MouseDoubleClick或者Double的响应都是先执行的Click然后再执行的Double,那个Clicks也用过,双击的话也是先0然后再1再2的变化的,,,

意思是如果双击那会先执行单击的那个操作然后再执行双击的操作。。。所以想区分单击和双击啊。

lzhdim | 园豆:642 (小虾三级) | 2024-02-08 11:37

我上面有贴出微软MSDN的那个链接啊,里面有介绍的,,,但是它那个代码需要定时器啥,觉得不太简洁,,,所以发帖问问大家有否这个问题,给个具体的代码。。。

lzhdim | 园豆:642 (小虾三级) | 2024-02-08 11:40

@lzhdim: 嗯呢,单双击切换确实是比较头痛的问题,我刚才试了一个可能行的解决方案,如果你可以接受的话:
其实也是通过计时,但是要比微软贴出来的简单些,使用 System.Diagnostics.Stopwatch 来测量两次点击之间的时间间隔:

 private Stopwatch stopwatch = new Stopwatch();
...
myButton.Click += MyButton_Click;
...
private void MyButton_Click(object sender, EventArgs e)
    {
        if (!stopwatch.IsRunning)
        {
            // 启动计时器
            stopwatch.Start();
        }
        else
        {
            // 停止计时器
            stopwatch.Stop();

            // 判断两次点击之间的时间间隔
            if (stopwatch.ElapsedMilliseconds < SystemInformation.DoubleClickTime)
            {
                // 处理双击事件的逻辑
                MessageBox.Show("双击事件触发");
            }
            else
            {
                // 处理单击事件的逻辑
                MessageBox.Show("单击事件触发");
            }

            // 重置计时器
            stopwatch.Reset();
        }
    }

这可以快速响应双击,但有个缺陷就是,单击需要先点击一次,而后再点一次,因为需要把stopwatch停下来,你可以参考一下

MonoiF | 园豆:282 (菜鸟二级) | 2024-02-08 11:57
其他回答(1)
0

还是用微软的方案吧。。。

lzhdim | 园豆:642 (小虾三级) | 2024-02-29 15:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册