使用Windows Forms在按钮上显示工具提示

250

如何在使用Windows Forms时,在按钮上显示工具提示?


13
以下文章结合视觉效果最佳地解释了它:http://www.dotnetperls.com/tooltip。 - vaichidrewar
10个回答

259

ToolTip是一个单一的WinForms控件,用于处理在单个窗体上为多个元素显示工具提示。

假设您的按钮名为MyButton:

  1. 向您的窗体添加一个ToolTip控件(位于Windows Forms工具箱中的常规控件下)。
  2. 给它一个名称 - 比如MyToolTip。
  3. 将“Tooltip on MyToolTip”属性(在按钮属性网格的Misc中)设置为悬停在按钮上时应出现的文本。

当光标悬停在按钮上时,工具提示将自动出现。但是,如果您需要以编程方式显示它,请调用:

MyToolTip.Show("Tooltip text goes here", MyButton);

在您的代码中显示工具提示,并且

MyToolTip.Hide(MyButton);
使其再次消失。

不错,但是有一个问题:如果我在表单中有多个按钮,我需要更多的工具提示还是可以为同一个工具提示设置多个描述和按钮? - ghiboz
9
您的表单只需一个工具提示控件,每个按钮可以有不同的帮助文本(这就是为什么“我的工具提示上的工具提示”是相关控件的属性,而不是工具提示控件本身的属性)。 - Dylan Beattie
3
在最简单的情况下,将工具提示添加到表单中是最好的选择。问题在于,在自定义控件的设计时间中,您无法引用父表单。解决方法是在控件中创建一个工具提示对象。不要认为ToolTip对象一定附加在表单上。 - Stéphane Gourichon

108

使用表单设计器:

  • 从工具箱中拖动ToolTip控件到表单上。
  • 选择您想要在其上显示工具提示的控件的属性。
  • 找到属性'ToolTip on toolTip1'(如果您更改了其默认名称,则名称可能不是toolTip1)。
  • 将该属性的文本设置为您想要显示的工具提示文本。

您也可以通过以下调用程序编程方式设置工具提示:

this.toolTip1.SetToolTip(this.targetControl, "My Tool Tip");

57
你可以使用ToolTip类:

为控件创建工具提示

示例:
private void Form1_Load(object sender, System.EventArgs e)
{
    System.Windows.Forms.ToolTip ToolTip1 = new System.Windows.Forms.ToolTip();
    ToolTip1.SetToolTip(this.Button1, "Hello");
}

2
这是完美的解决方案,因为它直接与自动生成的VS代码集成。谢谢 :) - fIwJlxSzApHEZIl
@DaveK 谢谢。这样做更好,因为我可以在一个地方定义所有的工具提示。 - fedeteka
谢谢。这是关于这个问题最好、最直接的答案。 - Najeeb
1
哎呀,如果按钮被禁用了,工具提示将不会显示。 - Janatbek Orozaly

9

对于默认的工具提示,可以使用以下方法-

System.Windows.Forms.ToolTip ToolTip1 = new System.Windows.Forms.ToolTip();
ToolTip1.SetToolTip(this.textBox1, "Hello world");

如果需要格式化工具提示信息,还可以使用自定义的工具提示。这可以通过自定义表单格式并将其用作控件鼠标悬停事件的工具提示对话框来创建。请查看以下链接获取更多详细信息 -

http://newapputil.blogspot.in/2015/08/create-custom-tooltip-dialog-from-form.html


7

在“Tag”属性中懒惰且紧凑地存储文本

如果您有点懒惰,而且不使用控件的“Tag”属性来执行其他操作,则可以使用它来存储工具提示文本并为所有此类控件分配“MouseHover”事件处理程序,如下所示:

private System.Windows.Forms.ToolTip ToolTip1;
private void PrepareTooltips()
{
    ToolTip1 = new System.Windows.Forms.ToolTip();
    foreach(Control ctrl in this.Controls)
    {
        if (ctrl is Button && ctrl.Tag is string)
        {
            ctrl.MouseHover += new EventHandler(delegate(Object o, EventArgs a)
            {
                var btn = (Control)o;
                ToolTip1.SetToolTip(btn, btn.Tag.ToString());
            });
        }
    }
}

在这种情况下,所有Tag属性中含有一个字符串的按钮都将被分配一个MouseHover事件。为了保持紧凑,使用lambda表达式内联定义了MouseHover事件。在事件中,任何悬停在按钮上的按钮都将其Tag文本分配给工具提示并显示。

7
.NET框架提供了一个ToolTip类。在表单上添加一个ToolTip对象,然后对于您想要为其添加提示的每个项目的MouseHover事件,可以执行以下操作:
private void checkBox1_MouseHover(object sender, EventArgs e)
{
    toolTip1.Show("text", checkBox1);
}

3
private void Form1_Load(object sender, System.EventArgs e)
{
    ToolTip toolTip1 = new ToolTip();
    toolTip1.AutoPopDelay = 5000;
    toolTip1.InitialDelay = 1000;
    toolTip1.ReshowDelay = 500;
    toolTip1.ShowAlways = true;
    toolTip1.SetToolTip(this.button1, "My button1");
    toolTip1.SetToolTip(this.checkBox1, "My checkBox1");
}

4
虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您帖子的质量。请记住,您正在回答未来读者的问题,这些人可能不知道您提出代码建议的原因。 - secelite

3

我根据DaveK的回答创建了一个控制扩展:

public static void SetToolTip(this Control control, string txt)
{
    new ToolTip().SetToolTip(control, txt);
}

然后您可以使用一行代码为任何控件设置工具提示:

this.MyButton.SetToolTip("Hello world");

1
不要这样做。ToolTip控件需要被处理,否则每次调用它时都会创建一个未被处理的孤立实例。这个扩展方法会泄漏系统资源。 - Joel Mueller
@Joel Mueller,确实最好的做法是处理前一个实例,但由于ToolTip将变得无引用,它不会被GC回收吗?如果不是这样,那么是的,我认为我的答案不应该直接使用。 - The_Black_Smurf

0
我已经完成了酷炫的工具提示 代码如下:
1.初始化提示对象
2.在需要显示你的创意时调用该对象
Ex-  
ToolTip t=new ToolTip();
t.setToolTip(textBoxName,"write your message here what tp you want to show up");

-4
当然,只需处理鼠标悬停事件并告诉它显示工具提示即可。它是一个工具提示,在全局或构造函数中定义:
ToolTip t = new ToolTip();

然后是事件处理程序:

private void control_MouseHover(object sender, EventArgs e)
{
  t.Show("Text", (Control)sender);
}

2
我认为你被投票否决是因为那不是在Windows Forms中使用ToolTip控件的方法。你只需要在表单上放置一个这样的控件,它就可以显示所有控件的提示。请参见其他回复中的代码。 - Julian Melville
1
我猜解释与代码不符,在解释中我说要显示它,在代码中我也初始化了。我的错。:P - Fry
2
@julianz 实际上,这对于拥有专门的工具提示非常有效,如果您想要根据状态进行动态调整(当然减去创建-请原谅我,我只是试图将其全部放入一个块中)。至于其他类似的回复... yshuditelu 和 Dylan Beattie 类似,尽管没有实例化。 - Fry

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