如何确定何时显示工具提示?

3
我正在使用.Net WinForms编写一个日历控件,它将为每个日期显示工具提示。
最好的方法是什么来确定何时显示工具提示?
在MouseMove中立即显示会妨碍操作,因此我希望它在鼠标悬停在每个日期单元格上时显示。
MouseHover事件只在MouseEnter后的第一次悬停时触发,所以我不能使用它。
有什么更好的方法吗?
编辑:我正在使用WinForms。
3个回答

6
系统信息中 SystemInformation.MouseHoverTime 指定了输入和悬停之间的时间延迟。
如果您使用的 UI 框架的内置工具提示处理代码无法满足需求,您可以在每次鼠标移动后启动一个计时器,并在计时器触发时显示工具提示。显然,您需要在每次鼠标移动时重置计时器,以防止出现“工具提示雨”。

如果鼠标移动但仍在MouseHoverSize范围内,我也应该显示工具提示;这比看起来要难。 (我是否需要存储每次移动,以便在MouseHoverTime之后检查它是否保持在附近?) - SLaks
@SLaks - 当鼠标离开由MouseHoverSize定义的矩形时,您需要重新启动计时器,就像您在首次启动计时器时所读取的那样。您只需要存储一个Point / Rect(根据实现而定)。 - Kevin Montrose
不行,因为如果它在中间开始停留在矩形内呢?(如果它移动了MouseHoverSize的一半,然后又移动了MouseHoverSize的三分之二,这样它就在先前移动到的点的MouseHoverSize范围内了?) - SLaks
你不需要在每次鼠标移动时更新边界,只需要在导致重置计时器的情况下进行更新。 - Kevin Montrose

0

请查看ToolTip类的AutoPopDelay、InitialDelay和ReshowDelay属性,因为它们控制工具提示的行为。

通常我会尝试不同的值,直到找到“感觉”正确的值。当工具提示立即显示时很烦人,对于短的工具提示,它们消失得太快也很烦人。对于非常长的工具提示,比如几段文字(是的,这是一个糟糕的设计决策,但如果有很多信息需要阅读,至少让我读完!),则应该在我的鼠标静止时保持打开状态。

MSDN的工具提示示例给出了以下值:

 AutoPopDelay = 5000;
 InitialDelay = 1000;
 ReshowDelay = 500;
 // Force the ToolTip text to be displayed whether or not the form is active.
 ShowAlways = true;

如在评论中所提到的那样,发布者希望以编程方式触发工具提示。为此,需要调用ToolTip.Show()方法。为了获得延迟效果,您可能需要运行一个计时器来计算鼠标静止的时间。每当鼠标进入、离开或在控件内移动时,都应该重置计时器。


问题在于我想在每个单元格悬停时显示工具提示,而不仅仅是在整个控件悬停时显示。 ToolTip类(据我所知)不支持这种本地操作,因此我必须自己显示它。问题是,我应该在什么时候显示它? - SLaks

0

如果您能告诉我您使用的技术是什么(ASP.NET?Forms?WPF?),那将非常有帮助,因为它们都有不同的实现工具提示的方式:

  • 在ASP.NET中,您可以简单地设置控件(例如在日历中显示数字的标签控件)的ToolTip属性,当鼠标悬停在控件上时,它会自动显示一个工具提示。
  • 在Forms中,我认为您必须实际创建一个ToolTip对象,然后将控件附加到它上面。
  • 在WPF中,您可以在XAML代码中添加Label.ToolTip元素。

无论如何,在所有情况下,都有一种内置的方法来实现它,因此您可能根本不需要编写自己的代码。

如果您的情况非常特殊,以至于您确实需要编写自己的代码,那么我真的需要更多了解您如何在日历中表示数字,以便帮助您。

最后一件事:你并没有真正询问这个问题 - 或者可能不在你的控制范围内 - 但你可能需要问问自己,是否使用工具提示来显示日历信息是最好的方法。如果空间非常紧张,那么答案可能是“是”,但如果你有足够的空间来显示日历事件(甚至是每个事件的前几个单词),这将避免用户必须“逐个日期滑过去”。-丹

不过,在所有情况下,都有内置的方法来实现它,所以你可能根本不需要编写自己的代码。但这并不完全正确。对于简单的情况(例如悬停在按钮上),这是正确的,但在某些控件中,您需要自己控制行为,而由于MouseHover的行为不易控制,因此这变得更加困难。 - Ed S.
嗨 Ed,所以,我猜即使是内置的ToolTip控件也依赖于MouseHover,而且它并不总是可靠地显示工具提示?我想我有时候确实注意到了这一点。在这种情况下,我想知道是否可以这样做:
  1. 在Control_MouseEnter事件中,创建一个Interval为500毫秒的Timer对象。
  2. 在Timer_Elapsed事件中,显示工具提示。
  3. 在Control_MouseLeave事件中,隐藏工具提示。
- devuxer
问题是我想在每个单元格悬停时显示工具提示,而不仅仅在整个控件悬停时显示。MouseHover事件只会在整个控件上触发一次,而我希望只有在鼠标停留在单元格上时(鼠标静止时),才显示工具提示,而不是鼠标移动进来就立即显示。 - SLaks
好的,我想我明白你的意思了。看起来Kevin给出了正确的答案。 - devuxer
1
@DanThMan:我以前做过类似的事情。我想我真正指的是需要自定义行为的自定义控件,比如可能是圆形控件,或者根据上下文显示不同内容的控件。对于简单的东西,内置的方式已经足够好了,并且行为在许多应用程序中都是相似的。 - Ed S.

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