我有一个 WinForms 应用程序。每个表单和用户控件都按如下方式设置其工具提示:
// in the control constructor
var toolTip = new ToolTip();
this.Disposed += (o, e) => toolTip.Dispose();
toolTip.SetToolTip(this.someButton, "...");
toolTip.SetToolTip(this.someCheckBox, "...");
...
但是,当我将鼠标悬停在控件上时,工具提示不会出现。这是使用工具提示的合适方法吗?应用程序的其他部分是否可能发生某些事情(例如监听某些事件),导致工具提示无法工作?
请注意,我的外部表单工具条按钮上的工具提示(通过按钮的工具提示属性配置)确实按预期工作。
编辑:
我对此进行了更多观察,我注意到有时工具提示确实会出现,但它非常“不稳定”。基本上,有时当我将鼠标悬停在控件上时,它会非常短暂地显示,然后闪烁消失。我可以使用 .Show() 和较长的 AutoPopDelay 手动显示它,但它永远不会消失!
当我的工具提示没有显示在 RichTextBox 上时,我遇到了类似的问题,大约是正常情况下的 3-5 倍。即使使用 toolTip.Show 强制它显式显示也没有帮助。直到我更改为 Shell 提到的方式 - 你必须告诉在哪里你希望工具提示出现:
'Dim pnt As Point
pnt = control.PointToClient(Cursor.Position)
pnt.X += 10 ' Give a little offset
pnt.Y += 10 ' so tooltip will look neat
toolTip.Show(text, control, pnt)
这样我的工具提示总是会在预期的时间和地点出现。 祝你好运!
你的代码对我来说似乎没问题。我在你的代码中找不到任何错误。但是,只有当控制被禁用时它才可能失败。顺便说一句,您可以尝试另一种类似的方法。但是,我不想建议您像这样显示工具提示。
private void someButton_MouseEnter(...)
{
toolTip.Show("Tooltip text goes here", (Button)sender);
}
您还可以通过
.Show()
方法指定工具提示的显示位置。您可以使用一些重载函数。有关 ToolTip.Show()
方法的更多信息,请阅读 msdn。
我编写了以下方法,将工具提示从父控件(具有工具提示集)“传播”到其子控件(除非它们有自己的覆盖工具提示)。
它的设计目的是放入您开始使用的表单或控件中,但也可以将其转换为需要“parent”参数的静态方法。
/// <summary>Setting a toolTip on a custom control unfortunately doesn't set it on child
/// controls within its drawing area. This is a workaround for that.</summary>
private void PropagateToolTips(Control parent = null)
{
parent = parent ?? this;
string toolTip = toolTip1.GetToolTip(parent);
if (toolTip == "")
toolTip = null;
foreach (Control child in parent.Controls)
{
// If the parent has a toolTip, and the child control does not
// have its own toolTip set - set it to match the parent toolTip.
if (toolTip != null && String.IsNullOrEmpty(toolTip1.GetToolTip(child)))
toolTip1.SetToolTip(child, toolTip);
// Recurse on the child control
PropagateToolTips(child);
}
}
请注意,如果您使用多个
ToolTip
实例来管理父子控件工具提示,则该行为是未定义的。
我的问题(标签页上的控件不显示工具提示)使用下面的代码
ToolTip toolTip = new ToolTip();
toolTip.SetToolTip(Control1OnTabPage1, Control1Text)
toolTip.SetToolTip(Control2OnTabPage2, Control2Text)
是由 TabPage1 上设置的工具提示引起的,后来被删除。这似乎删除了所有工具提示,而不仅仅是 TabPage1 上的工具提示。确保在稍后删除的页面上没有设置工具提示可以解决问题。