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

9
我想重写OnMouseClick和OnMouseDoubleClick,并根据使用的单击样式执行不同的操作。
问题在于OnMouseClick对于单击和双击都会发生,并且在OnMouseDoubleClick之前被调用。
我相信这一定是一个常见的需求,所以我想我可能漏掉了一些非常明显的东西。有人可以帮我吗?
编辑添加:MouseEventArgs.Clicks计数对此没有帮助。在双击的情况下,第一次单击将在OnMouseClick中处理为单击,并具有MouseEventArgs.Clicks == 1。
编辑添加:对象是图像缩略图。单击应该切换选择以进行导出。双击应该使缩略图全屏。选择和“激活”操作是正交的。这可能表明两个操作存在根本性问题...
敬礼, 罗布

你在单击和双击之间实现了什么行为?Windows标准是单击=选择,双击=打开,这使得在打开之前处理单击选择变得“安全”... - John Rudy
单击可切换选择的开/关状态(选择要导出的缩略图)。双击激活(使缩略图全屏)。因此,选择和激活是两个不同的操作。 - Rob
但是在激活之前,您需要进行选择,以便不会使它们独立处理无效。此外,在一般使用中,取消选择是单击其他位置,而不是第二次单击。 - James Curran
我有一个缩略图网格,因此在其他地方单击很困难。 - Rob
4个回答

13

这种情况在Windows中经常发生。我认为他们没有为处理它在.Net中添加任何特殊内容。

处理这种情况的正常方法是:

  • a)只需将单击设置成您希望在双击之前发生的操作,例如选择。
  • b)如果选项a不可行,则在单击事件上启动一个计时器。在计时器滴答响时执行单击操作。如果双击事件先发生,请停止计时器并执行双击操作。

您设置计时器时间应与系统的双击时间相等(用户可以在控制面板中指定)。 它可以从System.Windows.Forms.SystemInformation.DoubleClickTime获得。完整细节在MSDN中,这里


设置定时器时,请记住人们可能会并且经常会调整双击设置:http://blogs.msdn.com/oldnewthing/archive/2008/10/02/8969396.aspx ... 请确保适应这一点,否则在某些奇怪的情况下可能仍然会出现单击在双击之前的情况。 - John Rudy
一个计时器?!不要啊!(好吧,我承认它很实用,但它不够美观。这真的是唯一的方法吗?) 谢谢, 罗布 - Rob
完全有可能,是的。他们也可以单击一个项目,然后双击同一个图标,并期望选择状态保持不变。 - Rob
@Nicholas - 你可能是对的!有什么更好的想法吗? - Rob
@mathieu,是的,可能会发生不好的事情,但如果这是所需的用户体验,那就是在Windows核心和过去20年中成千上万的应用程序中完成的方式。 - James Curran
显示剩余3条评论

0
问题在于大多数对象都没有同时实现单击和双击。那些可以合理地对单击和双击采取不同操作的对象通常在运行双击操作之前运行单击操作(例如,先突出显示文件夹再打开它,先将焦点输入到地址栏再选择它等)。唯一确定的方法可能是等待一段时间进行单击操作,如果检测到双击,则取消单击操作。

0

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

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

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

使用计时器(吞掉双击的第一次单击)同样不太令人满意,并且还需要处理用户的双击速率偏好。

祝好, 罗布


我不确定那个是否有效。例如:用户点击A,然后双击B,这将选择、取消选择和展开B。现在,选择B会取消选择A吗?如果是这样,那你就完了。 - James Curran
对象是独立处理的,因此A与B是相互独立的。在我的实现中,通过MouseEventArgs传递的光标位置用于识别被单击的图像。 - Rob

-1

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

  • 如果计时器超时(例如300毫秒),则意味着单击。

否则

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

否则

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

NB:此实现的优点是,超时时间和“双击”半径都可以独立于系统配置进行配置,从而允许将s/w导入多台机器/


但是它的缺点是忽略了用户自己的双击超时偏好! - Rob
这是正确的,但它意味着您可以创建一个用户独立的一致系统。我想这归结于谁使用该系统,一个用户还是多个用户。 - TK.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接