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

时间:2009-01-29 11:26:14

标签: winforms

如果你在winform上有一个禁用按钮,你怎么能在鼠标悬停时显示一个工具提示来通知用户该按钮被禁用的原因?

4 个答案:

答案 0 :(得分:10)

我已经改编了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;
            }
        }
    
    }
    

答案 1 :(得分:9)

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

答案 2 :(得分: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;
   }

}

答案 3 :(得分: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;
            }
        }
    }