Как добавить всплывающую подсказку к элементу управления?

154

У меня есть некоторые элементы управления, для которых я хотел бы отобразить ToolTipкурсор, когда на них наведена мышь. Как я могу это сделать? Я хотел бы знать, как сделать это правильно в коде, но также и в конструкторе ( ToolTipв наборе инструментов есть компонент, но я не совсем .. понимаю).

Я не удивлюсь, если это дубликат, но я могу найти только вопросы по более сложным, конкретным сценариям. Я хотел бы знать основы.

Svish
источник
Связанный и более старый (относится к .NET в целом): stackoverflow.com/questions/168550/…
Кристофер Кайл Хортон

Ответы:

208

Вот ваша статья для того, чтобы сделать это с помощью кода

private void Form1_Load(object sender, System.EventArgs e)
{
     // Create the ToolTip and associate with the Form container.
     ToolTip toolTip1 = new ToolTip();

     // Set up the delays for the ToolTip.
     toolTip1.AutoPopDelay = 5000;
     toolTip1.InitialDelay = 1000;
     toolTip1.ReshowDelay = 500;
     // Force the ToolTip text to be displayed whether or not the form is active.
     toolTip1.ShowAlways = true;

     // Set up the ToolTip text for the Button and Checkbox.
     toolTip1.SetToolTip(this.button1, "My button1");
     toolTip1.SetToolTip(this.checkBox1, "My checkBox1");
}
Светлозар Ангелов
источник
3
Так что, думаю, не имеет значения, toolTip1выпадает ли переменная из области видимости?
Свиш
1
Как насчет одного статического ToolTipдля всех ваших форм?
Свиш
7
Он будет освобожден, как только станет не связанным, чего не будет, так как кнопка и флажок будут по-прежнему ссылаться на него
Роуланд Шоу,
2
Они ссылаются на него, потому что «SetToolTip» добавляет EventHandlers к событиям кнопки и флажка
Эдуардо Вада
3
Я считаю плохой идеей поместить подсказку в статическую переменную. Что если форма закрыта и открыта снова? Будет ли SetTooltip работать снова? И если так, обработчики закрытой формы останутся в памяти или будут удалены правильно? Я бы даже не потратил ни минуты на тестирование этого. Вместо этого используйте переменную члена - это пуленепробиваемое!
Эльму
139

Перетащите элемент управления всплывающей подсказки из панели инструментов на форму. Вам действительно не нужно давать ему какие-либо свойства, кроме имени. Затем в свойствах элемента управления, для которого вы хотите иметь всплывающую подсказку, найдите новое свойство с именем только что добавленного элемента управления всплывающей подсказкой. По умолчанию он даст вам всплывающую подсказку, когда курсор наведет курсор на элемент управления.

JYelton
источник
54
Убедитесь, что когда вы делаете это (как в 2 часа ночи), вы используете элемент управления ToolTip, а не элемент управления ToolStrip.
Адриан К
2
С этим ответом добавление только одной подсказки к winform дает всем элементам управления в форме их собственную подсказку.
СЭМ
1
Мощный в своей простоте, просто убедитесь, что вы поместили его на правильный элемент управления, а не на тот, что рядом с ним (как в 2 часа ночи).
Майкл Стимсон
40
  1. Добавьте компонент ToolTip к вашей форме
  2. Выберите один из элементов управления, для которого вы хотите всплывающую подсказку
  3. Откройте свойство grid ( F4), в списке вы найдете свойство «ToolTip on toolTip1» (или что-то подобное). Установите желаемый текст всплывающей подсказки для этого свойства.
  4. Повторите 2-3 для других элементов управления
  5. Готово.

Хитрость в том, что элемент управления ToolTip является элементом управления extender , что означает, что он расширит набор свойств для других элементов управления в форме. За кулисами это достигается путем генерации кода, как в ответе Светлозара. Есть другие элементы управления, работающие таким же образом (например,HelpProvider ).

Фредрик Мёрк
источник
1
Таким образом, вы можете использовать одну и ту же подсказку для множества элементов управления с разными текстами?
Свиш
@Svish: да, это и есть цель управления расширителем.
Фредрик Мёрк
Можно ли использовать кросс-пользовательский контроль и формы тоже? Например, если вы создали статическую подсказку со стандартными значениями свойств. Или это будет считаться плохой практикой?
Свиш
Я никогда не пробовал, и я не совсем знаю внутреннюю работу ToolTip, но, поскольку он получает ссылку на элемент управления, с которым связан текст, я думаю, он может работать. Есть только один способ узнать; попробуй: о)
Фредрик Мёрк
Ну, я, очевидно, попробую. Но я не особенно хорош в поиске таких вещей, как утечки памяти и тому подобное ... И если это приведет к утечке памяти или чему-то в этом роде, я бы хотел знать, хе-хе.
Свиш
8

Всплывающую подсказку в C # очень легко добавить практически ко всем элементам управления пользовательским интерфейсом. Вам не нужно добавлять какое-либо событие MouseHover для этого.

Вот как это сделать

  1. Добавьте объект ToolTip к вашей форме. Одного объекта достаточно для всей формы. ToolTip toolTip = new ToolTip();

  2. Добавьте элемент управления во всплывающую подсказку с нужным текстом.

    toolTip.SetToolTip(Button1,"Click here");

OopsDev
источник
1

Я сделал это следующим образом: просто добавьте событие в любой элемент управления, установите тег элемента управления и добавьте условие для обработки всплывающей подсказки для соответствующего элемента управления / тега.

private void Info_MouseHover(object sender, EventArgs e)
{
    Control senderObject = sender as Control;
    string hoveredControl = senderObject.Tag.ToString();

    // only instantiate a tooltip if the control's tag contains data
    if (hoveredControl != "")
    {
        ToolTip info = new ToolTip
        {
            AutomaticDelay = 500
        };

        string tooltipMessage = string.Empty;

        // add all conditionals here to modify message based on the tag 
        // of the hovered control
        if (hoveredControl == "save button")
        {
            tooltipMessage = "This button will save stuff.";
        }

        info.SetToolTip(senderObject, tooltipMessage);
    }
}
log-cab.in
источник
-3

Просто подпишитесь на событие элемента управления ToolTipTextNeeded и верните e.TooltipText, что намного проще.

fredv
источник
6
Я не думаю, что это стандартное событие управления WinForm.
Дан 7