【问题标题】:Iterating through tooltips迭代工具提示
【发布时间】:2010-05-19 01:30:11
【问题描述】:

伙计们,我有一个带有面板控件的 Windows 窗体,并且在面板控件内部还有其他几个控件,它们都附加了 System.Windows.Forms.Tooltip。如何遍历每个工具提示并将工具提示的 Active 属性设置为 false?与其他控件不同,工具提示实际上并不是控件。所以我有这个:

foreach (System.Windows.Forms.Control ctrl in this.pnlControl.Controls)
{
    if (ctrl.Name.StartsWith("tt")) // since all my tooltip names start with 'tt'
    {
        System.Windows.Forms.ToolTip TipControl=(System.Windows.Forms.ToolTip)ctrl;

        TipControl.Active=false;
    }
}

但这不起作用。由于 ToolTip 控件不是从 System.Windows.Forms.Control 继承的,因此会出现错误。有什么想法吗?

编辑: 好的伙计们。我可能没有详细说明以获得所需的答案。我的问题是,我将面板中的所有控件都移到另一个面板上。一旦它们被切换,工具提示仍然附加到控件上,这就是我想要的。但是,一旦我移动它们,我就无法停用或重新激活它们,因为表单和原始面板不再存在。不过,我找到了一个解决方案,我将在此处发布。

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    如何为两个按钮添加工具提示?正确的方法是不要以这种方式创建两个 ToolTip 实例:

     ToolTip tt1 = new ToolTip();   //or you can create one in the designer
     tt1.ToolTipTitle = "test";
     tt1.SetToolTip(button1, "caption1");
     ToolTip tt2 = new ToolTip();
     tt2.ToolTipTitle = "test2";
     tt2.SetToolTip(button2, "caption2");
    

    请记住,ToolTip 实例和控件不是一对一相关的。这个例子的正确方法是:

    ToolTip tt1 = new ToolTip();   //or you can create one in the designer
    tt1.ToolTipTitle = "test";
    tt1.SetToolTip(button1, "caption1");
    tt1.SetToolTip(button2, "caption2");
    

    要删除 button2 的工具提示,请使用:

    tt1.SetToolTip(button2,string.Empty);
    

    对于您的情况,我们可以使用

    foreach(Control c in this.Controls)
    {
       tt.SetToolTip(c,string.Empty);
    }
    

    【讨论】:

    • tt.Active 将影响 ToolTip 实例设置的其他控件。
    【解决方案2】:

    通常,您有一个 ToolTip 实例来处理所有控件的工具提示的显示。该单个 ToolTip 实例只是表单的常规成员。只需将其 Active 属性设置为 false。

    【讨论】:

      【解决方案3】:

      编辑:好的,放弃我之前的回答。是的,ToolTip 是一个组件,而不是一个控件,所以它实际上根本不在面板中。从您的问题来看,听起来您有一个 ToolTip 实例,并且您将它用于此面板内的控件以及其他控件,对吗?在这种情况下,解决方案很简单:创建一个单独的 ToolTip 实例并将该实例用于面板中的控件,然后直接引用它来停用它,例如。

      ttPanel.Active = false;
      

      【讨论】:

      • 问题是,不是。工具提示显然不被视为控件
      • 您通常如何访问或创建它们?我已经有一段时间没有使用 WinForms 了,所以不记得工具提示是如何工作的了。
      【解决方案4】:

      好吧,我所做的是创建一个从 Control 继承的新类,如下所示:

      public class TooltipMaster : System.Windows.Forms.Control
      {
          private System.Windows.Forms.ToolTip m_tooltip1;
          private System.Windows.Forms.ToolTip m_tooltip2;
          private System.Windows.Forms.ToolTip m_tooltip3;
          private System.Windows.Forms.ToolTip m_tooltip4;
      
          public System.Windows.Forms.ToolTip ToolTip1 {
              get { return m_tooltip1; }
              set { m_tooltip1 = value; }
          }
          public System.Windows.Forms.ToolTip ToolTip2 {
              get { return m_tooltip2; }
              set { m_tooltip2 = value; }
          }
          public System.Windows.Forms.ToolTip ToolTip3 {
              get { return m_tooltip3; }
              set { m_tooltip3 = value; }
          }
          public System.Windows.Forms.ToolTip ToolTip4 {
              get { return m_tooltip4; }
              set { m_tooltip4 = value; }
          }
      }
      

      然后我所做的是在我的主窗体的 Load 事件中创建这个类的一个实例。然后我只是将我的 4 个工具提示中的每一个都分配给了这个类中的 4 个工具提示。最后,我将此控件添加到我的面板中。完成所有这些之后,我可以稍后通过遍历每个控件并查找 TooltipMaster 控件来访问工具提示。 希望这是有道理的!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多