如何区分.Net中的单击和双击?

时间:2008-10-20 14:04:42

标签: c# .net user-interface click

我想覆盖OnMouseClick和OnMouseDoubleClick,并根据使用的点击样式执行不同的操作。

问题是OnMouseClick正在发生单击和双击,并且在OnMouseDoubleClick之前被调用。

我确定这一定是一个常见的要求,所以我想我错过了一些非常明显的东西。有人能填补我吗?

编辑添加:MouseEventArgs.Clicks计数没有帮助。如果是双击,则第一次单击将在OnMouseClick中单击一下,并使用MouseEventArgs.Clicks == 1.

编辑添加:对象是图像缩略图。单击即可打开和关闭选择以进行导出。双击应使缩略图全屏。选择和“激活”动作是正交的。这可能表明这两个行动存在潜在问题......

干杯, 罗布

4 个答案:

答案 0 :(得分:12)

整个Windows都会发生这种情况。我不认为他们在.Net中添加任何特殊处理它。

处理此问题的正常方法是

  • a)只需点击一下即可 你想要在双倍之前发生 点击,如选择。
  • b)如果那不是一个选项,那么在点击事件上,启动一个计时器。在计时器刻度上,执行单击操作。如果首先发生双击事件,请终止计时器,然后执行双击操作。

您设置时间的时间应该等于系统的双击时间(用户可以在控制面板中指定)。它可以从System.Windows.Forms.SystemInformation.DoubleClickTime获得。完整的详细信息位于MSDN中,here

答案 1 :(得分:0)

问题是大多数对象都没有实现这两个目标。对于单击和双击可以合理地具有不同操作的少数对象通常可以在双击操作之前运行单击操作(突出显示然后打开文件夹,在选择之前在地址栏上输入焦点等)。确定的方法可能是等待单击一段时间,如果检测到双击则取消单击的操作。

答案 2 :(得分:0)

另一种可能的解决方案是让OnMouseDoubleClick函数调用OnMouseClick。由于OnMouseClick中的操作是二进制切换,因此调用它两次会将其重置为相同的状态。

因此,当用户双击时,Windows会调用OnMouseClick,然后调用OnMouseDoubleClick。 OnMouseDoubleClick调用OnMouseClick(再次)恢复状态,然后处理双击。

作为一种解决方案,这种感觉并不令人满意,但它确实有效。

使用计时器(吞下双击的第一次点击)同样不令人满意,并且处理用户的双击率首选项会增加复杂性。

干杯, 罗布

答案 3 :(得分:-1)

您可以在OnMouseClick事件处理程序中启动计时器。

  • 如果计时器超时(比如300毫秒),则只需单击一下。

否则

  • 如果在超时之前生成了另一个OnMouseClick事件,您可以检查点击的x& y位置,如果它在第一次点击的特定半径内,则执行双击功能。

否则

  • 处理首次点击并重新初始化计时器以进行第二次点击

注意:这种实现的优势在于,timeoput和'double-click'半径都可以独立于系统配置进行配置,允许将s / w导入到多台机器上