Как показать подсказку на отключенной кнопке? - PullRequest
32 голосов
/ 29 января 2009

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

Ответы [ 4 ]

11 голосов
/ 29 января 2009

С тех пор я адаптировал ответ Бобби Шафтое к более общему

Примечания:

  • Событие 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;
            }
        }
    
    }
    
10 голосов
/ 20 июля 2012

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

8 голосов
/ 12 апреля 2012

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

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

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...