双击和单击 - 它们是互斥的吗?

6

有没有人能举出一个应用程序的例子,其中单击实体(比如图像)会执行一个操作,但是如果双击它,则会执行另一种操作?

我唯一找到的例子是在iTunes中双击曲目,但那样会选择它(单击功能),然后播放它(双击功能),这意味着(逻辑上)双击是包含单击的超集。

基本上,我被要求在WPF中实现图像单击执行一件事情,而图像双击执行另一件事情,我不确定这是否在概念上正确。

如果有人有任何合理的例子,请分享,谢谢!

8个回答

18

从Windows消息的角度来看,双击始终会首先生成单击消息;Windows无法预测是否会在时间内收到另一次单击以将其转换为双击。我无法想象WPF会隐藏这个物理事实。


2
这正是我所寻求的清晰度。干杯。 - Duncan Edwards
4
你要求应用程序的例子,但实际上是想让有人告诉你Windows系统中事件如何工作?太棒了。 - i_am_jorf
不要误会我的意思。balabaster的示例也非常有用。 - Duncan Edwards
1
@jeffamaphone StackOverflow充满了这样的问题 - 有时你必须读懂用户想要什么。 你已经编写了设计规格说明书,对吧?:P - BenAlabaster

11
回答直接问题:双击和单击是否互斥?答案是否定的,这是因为Windows需要解释鼠标行为的方式。
然而,对于更加模糊的问题,即双击是否不包括单击行为的先例[即这两个事件表现出互斥行为],在Windows中有一些特定的事件似乎展示了你所问的行为。
例如-任务栏小程序:
- 单击通常为该项打开快捷菜单。 - 双击通常为打开该任务栏项目链接的应用程序属性菜单,而不打开快捷菜单。
任务栏时钟:
- 单击没有任何作用。 - 双击打开日期和时间属性。
但是,你可能会注意到它需要片刻时间来响应你的请求,正如其他人所指出的那样,这种暂停是Windows等待看看你是否要双击。如果您不双击,则触发单击行为。如果您双击,则触发双击行为。在这些具体情况下,被认为适合采用互斥行为,还可能有其他情况。
我认为它真的取决于情况,以确定不同的行为是“正确”还是“错误”——我认为你不能明确地说在所有情况下哪个是对的或错误的。如果您希望展示的行为从用户角度来看是很合理的[而不是从您自己的程序员角度来看],那么请确保行为是互斥的;但是如果它对用户来说没有很好的逻辑意义,请避免使用它。

我注意到当你单击任务栏图标时,菜单需要一段时间才会出现。我想知道在单击处理程序中是否有特殊的代码来等待可能的双击? - Mark Ransom
系统通知区域(也称为“托盘”)实现了单击处理前的延迟,其默认大约为500毫秒,但可以根据您的双击延迟进行更改。这是Windows UI非常具体的一个部分实现该选项的方式。在正常情况下,这是糟糕的UI设计并且违反了Windows惯例,但在这种特定情况下是有意为之的。(关于此博客文章的一半:http://blogs.msdn.com/oldnewthing/archive/2009/04/30/9577283.aspx) - John Rudy
你是正确的。Raymond Chen 最近在关闭主题上写了一篇文章:http://blogs.msdn.com/oldnewthing/archive/2009/04/30/9577283.aspx。那半秒钟的延迟很不愉快。 - buti-oxa
可能是这样,我无法确定,因为我没有一个经过深入研究的答案。实际上,行为可以被抑制,就像在任何情况下一样 - 然而,对于最终用户来说,行为看起来是不同的,这与问题的暗示是一致的。 - BenAlabaster
@balabaster:当然,有时候需要打破UI惯例。但是,“在正常情况下”应该考虑到所有的后果。在大多数GUI场景中,双击被确定为单击+次要操作(例如,选择和操作)。如果没有非常强烈的理由打破这种用户期望,那么就不应该这样做。另一方面,如果确实有非常强烈的理由打破它,那么就要知道你正在做什么以及为什么这样做。 - John Rudy
显示剩余2条评论

2
通常将双击事件与单击事件不相关的操作联系起来是一种不好的模式。为了区分单击和双击,您需要等待一段时间以查看是否出现第二次点击。这可能会在您只是单击某个东西时造成令人不安的延迟。
雷蒙德·陈(Raymond Chen)在他的一个博客帖子中有关于此问题的良好解释,包括如何处理。
但我会先向设计师反对。

1

最明显的应该是Finder/Explorer,单击文件选择它,双击打开它。这种做法有很多先例,并且人们已经通过操作系统级别的包含来接受了双击执行不同操作的想法。

  • 文本选择(几乎所有现有应用程序中)- 单击放置光标,双击选择单词,三击选择整行。
  • Explorer/Finder - 单击选择文件,双击打开文件。
  • Outlook - 单击预览电子邮件,双击在新窗口中打开。

1
你的例子中没有展示单击和双击之间互斥的操作。文本选择:单击放置光标,双击选择已选定光标位置的单词。资源管理器:单击选择文件,双击打开已选定的文件。Outlook:单击选择邮件,并作为选择的副作用,在预览窗口中显示它(如果已配置),双击打开已选定的邮件在自己的窗口中(并且它仍然保留在预览视图中)。在所有三种情况下,单击是双击的前置条件。 - Stephen C. Steel

1
Cooliris 中,如果你点击墙上的一个单元格,它就会被选中。如果你双击图片,它会过渡到全屏幻灯片模式,并从那张图片开始。

0
private void OnItemMouseDown(object sender, MouseButtonEventArgs e) {
    if(e.ClickCount==2) {
        // DoubleClick Function
    }

    if(e.ClickCount==1) {
        // Click Function
    }
}

0

微软 Excel。将鼠标移动到未选择的单元格上。

单击 = 选择单元格

双击 = 进入该单元格的编辑模式


真的-它确实选择了单元格。但是尝试使用单击进入编辑模式。你不能。两者之间的编辑语义也不同。如果选择了单元格(但未处于编辑模式),则键入时替换单元格内容。如果单元格处于编辑模式,则插入字符在光标处。不完全是超集/子集行为,但是观点很好。 - micahtan

0

综合其他人的说法,双击并不会“取消”单击。

因此,您永远不应该在双击事件中执行依赖于单击更改的状态的操作,因为单击总是先被执行!

反过来,您可以依赖于单击后的状态在开始双击操作时有效。例如:在文件列表中单击选择文件,在双击事件中,您知道所选文件已被选择...


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