【问题标题】:Display a tooltip over a button using Windows Forms使用 Windows 窗体在按钮上显示工具提示
【发布时间】:2010-09-15 04:13:33
【问题描述】:

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

【问题讨论】:

标签: .net winforms button tooltip


【解决方案1】:

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

假设您的按钮名为 MyButton。

  1. 添加一个 ToolTip 控件(在 Common Windows 窗体中的控件 工具箱)添加到您的表单中。
  2. 给它一个 名称 - 说 MyToolTip
  3. 设置 MyButton 的“Tooltip on MyToolTip”属性(在 Misc 下 按钮属性网格)到当您将鼠标悬停在其上时应显示的文本。

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

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

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

MyToolTip.Hide(MyButton);

让它再次消失。

【讨论】:

  • 很好,但是有个问题:如果我在一个表单中有多个按钮,我需要更多的工具提示,或者我可以为同一个工具提示设置多个描述和按钮?
  • 您的表单只需要一个 ToolTip 控件 - 每个按钮可以有不同的帮助文本(这就是为什么“MyToolTip 上的 Tooltip”是关联控件的属性,而不是 ToolTip 控件本身的属性)
  • 在最简单的情况下,将工具提示添加到表单是最好的做法。问题:在自定义控件的设计时,您没有对父窗体的引用。解决方法:在Control中创建一个tooltip对象。不要认为 ToolTip 对象必须附加到表单。
【解决方案2】:

使用表单设计器:

  • 将 ToolTip 控件从工具箱拖到窗体上。
  • 选择您希望显示工具提示的控件的属性。
  • 找到属性“ToolTip on toolTip1”(如果您更改了它的默认名称,该名称可能不是 toolTip1)。
  • 将属性文本设置为您要显示的工具提示文本。

您还可以使用以下调用以编程方式设置工具提示:

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

【讨论】:

    【解决方案3】:

    您可以使用 ToolTip 类:

    Creating a ToolTip for a Control

    例子:

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

    【讨论】:

    • 这是完美的解决方案,因为它直接与自动生成的 VS 代码集成。谢谢:)
    • @DaveK 谢谢。这种方式更好,因为我可以在一个地方定义所有工具提示
    • 谢谢。这个问题的最佳和最直接的答案。
    • 嗯,如果按钮被禁用,工具提示将不会显示。
    【解决方案4】:

    对于默认工具提示,可以使用 -

    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

    【讨论】:

      【解决方案5】:

      .NET 框架提供了一个 ToolTip 类。将其中一个添加到您的表单中,然后在您想要工具提示的每个项目的 MouseHover 事件上,执行以下操作:

      private void checkBox1_MouseHover(object sender, EventArgs e)
      {
          toolTip1.Show("text", checkBox1);
      }
      

      【讨论】:

        【解决方案6】:

        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 事件。为了保持紧凑,MouseHover 事件是使用 lambda 表达式内联定义的。如果任何悬停的按钮都将其标签文本分配给工具提示并显示出来。

        【讨论】:

          【解决方案7】:
          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");
          }
          

          【讨论】:

          • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
          【解决方案8】:

          基于DaveK's answer,我创建了一个控件扩展:

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

          然后您可以为任何控件设置工具提示,只需一行:

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

          【讨论】:

          • 不要这样做。 ToolTip 控件需要被释放,这会创建一个孤立实例,每次调用时都不会释放它。这种扩展方法会泄漏系统资源。
          • @Joel Mueller,确实,处置前一个实例会是一种更好的做法,但由于 ToolTip 将变为未引用,这不是 collected by the GC 吗?如果不是,那么是的,我认为我的答案不应该按原样使用。
          【解决方案9】:

          当然,只需处理鼠标悬停事件并告诉它显示工具提示即可。 t 是在全局变量或构造函数中定义的工具提示:

          ToolTip t = new ToolTip();
          

          然后是事件处理程序:

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

          【讨论】:

          • 我认为您被否决了,因为这不是在 Windows 窗体中使用工具提示控件的方式。您只需要在表单上使用一个这样的控件,它会显示所有控件的提示。请参阅其他响应中的代码。
          • 我猜解释与代码不符,在解释中我说的地方显示它并且在代码中我也初始化了它。我的错。 :P
          • @ julianz 实际上,这适用于拥有专门的工具提示,如果你想根据状态可以是动态的(当然减去创建 - 请原谅我,我只是想把它全部放在一个块中.) 至于其他类似的反应...... yshuditelu 和 Dylan Beattie 是相似的,尽管没有实例化。
          猜你喜欢
          • 2014-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-29
          • 1970-01-01
          • 1970-01-01
          • 2016-06-15
          • 1970-01-01
          相关资源
          最近更新 更多