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


154

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

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



Связанный и более старый (относится к .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

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


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");


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);
    }
}

-3

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


6
Я не думаю, что это стандартное событие управления WinForm.
Дан 7
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.