¿Cómo agrego una información sobre herramientas a un control?

154

Tengo algunos controles para los que me gustaría mostrar ToolTipcuando el mouse se encuentra sobre él. ¿Cómo puedo hacer esto? Me gustaría saber cómo hacer esto correctamente en el código, pero también en el diseñador (Hay un ToolTipcomponente en la caja de herramientas, pero no lo entiendo ...).

No me sorprendería si esto es un duplicado, pero solo puedo encontrar preguntas sobre escenarios específicos más avanzados. Me gustaría saber lo básico.

Svish
fuente
Relacionado y más antiguo aún (se aplica a .NET en general): stackoverflow.com/questions/168550/…
Christopher Kyle Horton

Respuestas:

208

Aquí está tu artículo para hacerlo con código

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");
}
Svetlozar Angelov
fuente
3
Entonces, ¿no importa si la toolTip1variable cae fuera del alcance?
Svish
1
¿Qué pasa con una estática ToolTippara todos sus formularios?
Svish
77
Que sería liberada una vez que quedó sin referencias, que no sería, como el botón y casilla todavía referencia a ella
Rowland Shaw
2
Lo están haciendo referencia porque "SetToolTip" agrega EventHandlers al botón y los eventos de la casilla de verificación
Eduardo Wada
3
Creo que es una mala idea poner la información sobre herramientas en una variable estática. ¿Qué pasa si un formulario se cierra y se abre de nuevo? ¿Funcionará SetTooltip nuevamente? Y si es así, ¿los controladores de la forma cerrada permanecerán en la memoria o se eliminarán correctamente? Ni siquiera pasaría un minuto probando eso. Use un miembro variabe en su lugar, ¡eso es a prueba de balas!
Elmue
139

Arrastre un control de información sobre herramientas desde la caja de herramientas a su formulario. Realmente no necesita darle ninguna propiedad que no sea un nombre. Luego, en las propiedades del control en el que desea tener información sobre herramientas, busque una nueva propiedad con el nombre del control de información sobre herramientas que acaba de agregar. De forma predeterminada, le dará información sobre herramientas cuando el cursor pase el control.

JYelton
fuente
54
Asegúrese de que cuando haga esto (como a las 2 a. M.) Utilice un control ToolTip y no un control ToolStrip.
Adrian K
2
Con esta respuesta, al agregar solo una información sobre herramientas a la forma de ganancia, todos los controles en el formulario tienen su propia información sobre herramientas.
SAm
1
Potente en su simplicidad, solo asegúrese de colocarlo en el control correcto y no en el que está al lado (como a las 2 am).
Michael Stimson
40
  1. Agregue un componente de información sobre herramientas a su formulario
  2. Seleccione uno de los controles para los que desea información sobre herramientas
  3. Abra la cuadrícula de propiedades (F4 ), en la lista encontrará una propiedad llamada "ToolTip on toolTip1" (o algo similar). Establezca el texto de información sobre herramientas deseado en esa propiedad.
  4. Repita 2-3 para los otros controles
  5. Hecho.

El truco aquí es que el control ToolTip es un control extensor , lo que significa que extenderá el conjunto de propiedades para otros controles en el formulario. Detrás de escena, esto se logra generando código como en la respuesta de Svetlozar. Hay otros controles que funcionan de la misma manera (como el HelpProvider).

Fredrik Mörk
fuente
1
¿Entonces puede usar la misma información sobre herramientas para muchos controles con diferentes textos?
Svish
@Svish: sí, ese es el propósito de los controles de extensión.
Fredrik Mörk
¿Se puede usar también entre controles y formularios de usuario? Como si hubiera creado una información sobre herramientas estática con sus valores de propiedad estándar. ¿O eso se consideraría una mala práctica?
Svish
Nunca lo intenté, y no conozco el funcionamiento interno de ToolTip, pero dado que obtiene una referencia al control con el que está relacionado un texto, supongo que podría funcionar. Sólo hay una forma de averiguarlo; pruébalo: o)
Fredrik Mörk
Bueno, obviamente lo probaré. Pero no soy especialmente bueno para encontrar cosas como pérdidas de memoria y demás ... Y si me causara una pérdida de memoria o algo así, me gustaría saber, jeje.
Svish
8

La información sobre herramientas en C # es muy fácil de agregar a casi todos los controles de la interfaz de usuario. No necesita agregar ningún evento MouseHover para esto.

Asi es como se hace-

  1. Agregue un objeto de información sobre herramientas a su formulario. Un objeto es suficiente para todo el formulario. ToolTip toolTip = new ToolTip();

  2. Agregue el control a la información sobre herramientas con el texto deseado.

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

OopsDev
fuente
1

Lo hice de esta manera: simplemente agregue el evento a cualquier control, establezca la etiqueta del control y agregue un condicional para manejar la información sobre herramientas para el control / etiqueta apropiado.

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);
    }
}
cuarto de troncos
fuente
-3

Simplemente suscríbase al evento ToolTipTextNeeded del control y devuelva e.TooltipText, mucho más simple.

fredv
fuente
66
No creo que sea un evento de control estándar de WinForm.
Dan7