【问题标题】:How do I determine when to show a tooltip?如何确定何时显示工具提示?
【发布时间】:2009-06-29 03:13:47
【问题描述】:

我正在.Net WinForms 中编写一个日历控件,它将显示每个日期的工具提示。

确定何时显示工具提示的最佳方式是什么?

立即在MouseMove 中显示它会妨碍它,所以我希望它显示鼠标悬停在每个日期单元格上的时间。

MouseHover 事件仅在MouseEnter 之后的第一次悬停时触发,所以我不能使用它。

最好的方法是什么?

编辑:我正在使用 WinForms

【问题讨论】:

    标签: c# .net winforms controls tooltip


    【解决方案1】:

    进入和悬停之间的时间延迟在SystemInformation.MouseHoverTime 中指定。

    如果由于某种原因,您使用的任何 UI 框架的内置工具提示处理代码都不够用,您可以在每次 MouseMove 之后启动一个计时器,并在它触发时显示一个工具提示。显然,每次移动鼠标时都需要重置 Timer,以防止出现一系列“工具提示雨”。

    【讨论】:

    • 如果鼠标移动了,我也应该显示工具提示,但停留在 MouseHoverSize 内;这似乎更难。 (我是否必须存储每个动作,以便在 MouseHoverTime 之后检查它是否停留在它附近?)
    • @SLaks - 当鼠标离开由 MouseHoverSize 定义的矩形时,当您第一次启动 Timer 时,您将重新启动 Timer。您只需要存储一个点/矩形(取决于实现)。
    • 不,因为如果它停留在从中间开始的矩形内怎么办? (如果它移动了 MouseHoverSize 的一半,然后又移动了 MouseHoverSize 的四分之三,这样它就在它之前移动到的点的 MouseHoverSize 之内?)
    • 您不会更新每次鼠标移动的边界,只会更新那些导致重置计时器的边界。
    【解决方案2】:

    了解您使用的是哪种技术(ASP.NET?Forms?WPF?)会很有帮助,因为它们都有不同的工具提示实现方式:

    • 使用 ASP.NET,您可以简单地设置 控件的 ToolTip 属性(例如 作为在日历中显示数字的标签控件),并且它 将自动显示工具提示 悬停时稍有延迟后 控制权。
    • 在表单中,我认为您必须 然后实际创建一个 ToolTip 对象 为其附加一个控件。
    • 在 WPF 中,您可以添加 Label.ToolTip 元素添加到您的 XAML 代码中。

    不过,在所有情况下,都有一种内置方法可以做到这一点,因此您可能根本不需要编写自己的代码。

    如果您的情况如此定制以至于您确实需要编写自己的代码,我真的需要更多地了解您如何表示日历中的数字以帮助您。

    最后一件事:你并没有真正问过这个问题——而且它可能不在你的控制之下——但你可能想问自己,工具提示是否是首先显示日历信息的最佳方式。如果空间真的很紧,那么答案可能是“是”,但是如果您有足够的空间来显示日历事件(甚至是每个事件的前几个单词),这将使用户不​​必“擦洗整个日历”(即,单独滚动每个日期)。

    -丹

    【讨论】:

    • “不过,在所有情况下,都有一种内置方法可以做到这一点,因此您可能根本不需要编写自己的代码。” - 所以不是真的。对于简单的情况(例如,将鼠标悬停在按钮上)确实如此,但在某些控件中,您需要自己控制行为,并且由于 MouseHover 的行为,这并不容易。
    • 嗨 Ed,所以,我猜即使是内置的 ToolTip 控件也依赖于 MouseHover,而且每次都显示工具提示还不够可靠?我想我已经注意到了几次。在这种情况下,我想知道这样做是否可行: 1. 在 Control_MouseEnter 上,创建一个间隔 = 500ms 的 Timer 对象。 2. 在 Timer_Elapsed 上,显示工具提示。 3. 在 Control_MouseLeave 上,隐藏工具提示。
    • 问题是我想在每个单元格悬停时显示工具提示,而不仅仅是在整个控件悬停时。 MouseHover 只会为整个控件触发一次,我只想在单元格悬停时显示它(如果鼠标保持静止),而不是在鼠标移入时显示。
    • 好的,我想我明白你的意思了。看起来凯文有正确的答案。
    • @DanThMan:我以前做过类似的事情。我想我实际上指的是需要自定义行为的自定义控件,例如循环控件,或者应该根据上下文显示不同内容的控件。对于简单的东西,内置方式运行良好,并且许多应用程序的行为相似。
    【解决方案3】:

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

    我通常会玩弄这些价值观,直到我得到“感觉”正确的东西。当工具提示立即显示时很烦人,而对于简短的工具提示,当它们过早消失时也很烦人。对于很长的工具提示,比如说,几个段落(是的,糟糕的设计决策,但如果有很多信息要阅读,至少让我阅读它!)那么只要我的鼠标静止,它就应该保持打开状态。

    来自 MSDN 的 tooltip example 给出以下值:

     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 类(AFAIK)本身不支持这个,所以我必须自己展示它。问题是,我应该什么时候展示它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多