如何在禁用按钮上显示工具提示?

Sam*_*ill 35 winforms

如果您在winform上有一个禁用按钮,那么如何在鼠标悬停时显示工具提示以告知用户禁用该按钮的原因?

Sam*_*ill 12

从那以后,我对BobbyShaftoe的答案进行了调整,使其更具一般性

笔记:

  • 必须在父控件上设置MouseMove事件(在我的情况下是一个面板)

    private void TimeWorks_MouseMove(object sender, MouseEventArgs e)
    {
        var parent = sender as Control;
        if (parent==null)
        {
            return;
        }
        var ctrl = parent.GetChildAtPoint(e.Location);
        if (ctrl != null && !ctrl.Enabled)
        {
            if (ctrl.Visible && toolTip1.Tag==null)
            {
                var tipstring = toolTip1.GetToolTip(ctrl);
                toolTip1.Show(tipstring, ctrl, ctrl.Width / 2, ctrl.Height / 2);
                toolTip1.Tag = ctrl;
            }
        }
        else
        {
            ctrl = toolTip1.Tag as Control;
            if (ctrl != null)
            {
                toolTip1.Hide(ctrl);
                toolTip1.Tag = null;
            }
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)


gal*_*xis 12

将按钮(或适合此方案的任何控件)放在容器(panel,tableLayoutPanel)中,并将工具提示与相应的基础面板单元格相关联.在许多场景中都很有效,灵活.提示:使单元格足够大以容纳bttn,因此鼠标悬停响应(工具提示显示)似乎不会在bttn边界外"流血".

  • 这是迄今为止最优雅的答案.如果您需要TableLayoutPanel单元格上的工具提示,则必须在单元格中放置一个面板,然后在面板中放置您的控件,因为TableLayoutPanel单元格不能仅被引用它们包含的控件. (4认同)
  • 嘿@SamMackrill(对于迟到的响应,但对于后代),真正的数据,但应该只用于需要它的ctrls(通常只有几个)避免了大量不必要的代码/复杂性,使实现可视化,因此非开发人员(例如设计师)可以实施/维护。创建已经以这种方式配置为 pkg 的自定义 crtls 可能有点方便。 (2认同)

Bob*_*toe 8

因此,假设您的控件被调用,button1您可以执行类似的操作.
您必须通过处理MouseMove表单事件来执行此操作,因为事件不会从您的控件中触发.

bool IsShown = false;      

void Form1_MouseMove(object sender, MouseEventArgs e)
{
   Control ctrl = this.GetChildAtPoint(e.Location);

   if (ctrl != null)
   {
       if (ctrl == this.button1 && !IsShown)
       {
           string tipstring = this.toolTip1.GetToolTip(this.button1);                 
           this.toolTip1.Show(tipstring, this.button1, this.button1.Width /2, 
                                                       this.button1.Height / 2);
           IsShown = true;
       }
   }
   else
   {
       this.toolTip1.Hide(this.button1);
       IsShown = false;
   }
Run Code Online (Sandbox Code Playgroud)

}


Pet*_*rtt 8

Sam Mackrill,感谢您的回答,很高兴使用Tag来了解您要离开的Control.但是根据BobbyShaftoe的回答,你仍然需要IsShown标志.如果您将鼠标放在错误的位置,如果工具提示出现在它下面,它可以触发另一个MouseMove事件(即使您没有物理移动鼠标).这可能会导致一些不需要的动画,因为工具提示会不断消失并重新出现.

这是我的代码:

    private bool toolTipShown = false;
    private void TimeWorks_MouseMove(object sender, MouseEventArgs e)
    {
        var parent = sender as Control;
        if (parent == null)
        {
            return;
        }
        var ctrl = parent.GetChildAtPoint(e.Location);
        if (ctrl != null)
        {
            if (ctrl.Visible && toolTip1.Tag == null)
            {
                if (!toolTipShown)
                {
                    var tipstring = toolTip1.GetToolTip(ctrl);
                    toolTip1.Show(tipstring.Trim(), ctrl, ctrl.Width / 2, ctrl.Height / 2);
                    toolTip1.Tag = ctrl;
                    toolTipShown = true;
                }
            }
        }
        else
        {
            ctrl = toolTip1.Tag as Control;
            if (ctrl != null)
            {
                toolTip1.Hide(ctrl);
                toolTip1.Tag = null;
                toolTipShown = false;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)