【问题标题】:How can I differentiate between single and double clicks in .Net?如何区分.Net中的单击和双击?
【发布时间】:2008-10-20 14:04:41
【问题描述】:

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

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

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

编辑添加:MouseEventArgs.Clicks 计数没有帮助。在双击的情况下,第一次单击在 OnMouseClick 中被处理为单击 MouseEventArgs.Clicks == 1。

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

干杯, 抢

【问题讨论】:

  • 您在单击和双击之间实现了什么行为? Windows标准是单击=选择,双击=打开,使单击选择“安全”在打开之前进行处理...
  • 单击打开和关闭选择(选择要导出的缩略图)。双击激活(使缩略图全屏)。所以选择和激活是两个不同的操作。
  • 但是您会希望在激活之前进行选择,这样不会使独立处理它们无效。此外,在一般使用中,取消选择是在其他地方单击,而不是第二次单击。
  • 我有一个缩略图网格,所以很难点击其他地方。

标签: c# .net user-interface click


【解决方案1】:

这在整个 Windows 中都会发生。我不认为他们在 .Net 中添加了任何特别的东西来处理它。

正常的处理方式是

  • a) 只需单击一下即可 你想在双倍之前发生 点击,比如选择。
  • b) 如果这不是一个选项,那么在点击事件上,启动一个计时器。在计时器滴答声中,执行单击操作。如果双击事件先发生,则终止定时器,然后执行双击动作。

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

【讨论】:

  • 请记住,在设置计时器时,人们可以而且经常会搞砸他们的双击设置:blogs.msdn.com/oldnewthing/archive/2008/10/02/8969396.aspx ... 一定要适应这一点,否则您可能仍然会在之前获得单击在某些奇怪的情况下翻倍。
  • 计时器!?不! (好吧,我承认它很实用,但它并不漂亮。这真的是唯一的方法吗?)干杯,Rob
  • +1 到选项 a。选项 b 可以完成,但正如约翰所说,可能会发生坏事。在您的场景中,使用第一次单击=选择,第二次单击=全屏是安全的
  • 单击必须同时选择和取消选择。当切换到全屏时,用户不会期望他们的选择会改变。
  • 所以,您是说用户会单击项目以选择它,然后双击不同的项目以全屏显示它,并希望第一个项目保持选中状态?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    所以当用户双击时,windows 调用 OnMouseClick,然后调用 OnMouseDoubleClick。 OnMouseDoubleClick (再次)调用 OnMouseClick 来恢复状态,然后处理双击。

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

    使用计时器(吞下双击的第一次单击)同样不令人满意,并且处理用户的双击率偏好增加了复杂性。

    干杯, 抢

    【讨论】:

    • 我不确定这是否有效。例如:用户单击 A,然后双击 B,选择、取消选择和扩展 B。现在,选择 B,是否取消选择 A?如果是这样,你就完蛋了。
    • 对象是独立处理的,因此A独立于B。在我的实现中,通过MouseEventArgs传入的光标位置用于识别点击了哪个图像。
    【解决方案4】:

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

    • 如果计时器超时(例如 300 毫秒),则需要单击一次。

    否则

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

    否则

    • 处理第一次点击并为第二次点击重新初始化计时器

    注意:这种实现的优点是时间输出和“双击”半径都可以独立于系统配置进行配置,从而允许将 s/w 导入到多台机器上/

    【讨论】:

    • 但缺点是忽略了用户自己的双击超时偏好!
    • 这是对的,但这意味着您可以创建一个与用户无关的一致系统。我想这归结为谁使用系统,一个用户或多个用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多