Подтвердить что ты не робот

Как показать всплывающую подсказку на отключенной кнопке?

Если у вас есть кнопка отключения на winform, как вы можете показать подсказку для мыши, чтобы сообщить пользователю, почему кнопка отключена?

4b9b3361

Ответ 1

Сэм Макрилл, спасибо за ваш ответ, отличная идея использовать тег, чтобы узнать, какой контроль вы уходите. Однако вам по-прежнему нужен флаг IsShown в соответствии с ответом BobbyShaftoe. Если у вас есть мышь в неправильном месте, если под ней появляется подсказка, она может запустить другое событие 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;
            }
        }
    }

Ответ 2

С тех пор я адаптировал 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;
            }
        }
    
    }
    

Ответ 3

Поместите кнопку (или любой элемент управления, соответствующий этому сценарию) в контейнер (панель, tableLayoutPanel) и привяжите всплывающую подсказку к соответствующей ячейке панели. Отлично работает в ряде сценариев, гибкий. Совет: сделайте ячейку достаточно большой, чтобы удерживать bttn, поэтому ответ мыши (всплывающая подсказка) не кажется "истекающим" вне границ bttn.

Ответ 4

Итак, если ваш контроль называется 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;
   }

}