Comment ajouter une info-bulle à un contrôle?

154

J'ai quelques commandes que je voudrais afficher ToolTiplorsque la souris survole. Comment puis-je faire ceci? J'aimerais savoir comment faire cela correctement dans le code, mais aussi dans le concepteur (il y a un ToolTipcomposant dans la boîte à outils, mais je ne comprends pas tout à fait…).

Je ne serais pas surpris s'il s'agit d'un doublon, mais je ne peux trouver que des questions qui concernent des scénarios spécifiques plus avancés. J'aimerais connaître les bases.

Svish
la source
Copie
Jim Fell
Connexes et plus anciens encore (s'applique à .NET en général): stackoverflow.com/questions/168550/…
Christopher Kyle Horton

Réponses:

208

Voici votre article pour le faire avec du code

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
la source
3
Donc, je suppose que peu importe si la toolTip1variable sort du champ d'application?
Svish
1
Qu'en est-il d'un statique ToolTippour tous vos formulaires?
Svish
7
Il serait libéré une fois qu'il ne serait plus référencé, ce qui ne serait pas le cas, car le bouton et la case à cocher le référenceraient toujours
Rowland Shaw
2
Ils le font référence parce que "SetToolTip" ajoute EventHandlers aux événements du bouton et de la case à cocher
Eduardo Wada
3
Je pense que c'est une mauvaise idée de mettre l'info-bulle dans une variable statique. Que faire si un formulaire est fermé et ouvert à nouveau? Le SetTooltip fonctionnera-t-il à nouveau? Et si tel est le cas, les gestionnaires du formulaire fermé resteront-ils en mémoire ou supprimés correctement? Je ne passerais même pas une minute à tester cela. Utilisez plutôt un membre variabe - c'est à l'épreuve des balles!
Elmue du
139

Faites glisser un contrôle d'info-bulle de la boîte à outils vers votre formulaire. Vous n'avez pas vraiment besoin de lui donner d'autres propriétés qu'un nom. Ensuite, dans les propriétés du contrôle sur lequel vous souhaitez afficher une info-bulle, recherchez une nouvelle propriété avec le nom du contrôle d'info-bulle que vous venez d'ajouter. Il vous donnera par défaut une info-bulle lorsque le curseur survole le contrôle.

JYelton
la source
54
Assurez-vous que lorsque vous effectuez cette opération (comme à 2 heures du matin) que vous utilisez un contrôle ToolTip et non un contrôle ToolStrip.
Adrian K
2
Avec cette réponse, l'ajout d'une seule info-bulle au winform donne à tous les contrôles sous la forme leur propre info-bulle.
Sam le
1
Puissant dans sa simplicité, assurez-vous simplement de le déposer sur la bonne commande et non sur celle à côté (comme à 2h du matin).
Michael Stimson le
40
  1. Ajouter un composant info-bulle à votre formulaire
  2. Sélectionnez l'un des contrôles pour lesquels vous souhaitez une info-bulle
  3. Ouvrez la grille des propriétés ( F4), dans la liste, vous trouverez une propriété appelée "Info-bulle sur toolTip1" (ou quelque chose de similaire). Définissez le texte d'info-bulle souhaité sur cette propriété.
  4. Répétez 2-3 pour les autres contrôles
  5. Terminé.

L'astuce ici est que le contrôle ToolTip est un contrôle d'extension , ce qui signifie qu'il étendra l'ensemble de propriétés pour d' autres contrôles du formulaire. Dans les coulisses, cela est réalisé en générant du code comme dans la réponse de Svetlozar. Il existe d'autres contrôles fonctionnant de la même manière (comme le HelpProvider).

Fredrik Mörk
la source
1
Vous pouvez donc utiliser la même info-bulle pour de nombreux contrôles avec des textes différents?
Svish
@Svish: oui, c'est le but des contrôles d'extendeurs.
Fredrik Mörk
Peut-il également être utilisé contre les contrôles d'utilisateurs et les formulaires? Comme si vous créiez une info-bulle statique avec vos valeurs de propriété standard. Ou serait-ce considéré comme une mauvaise pratique?
Svish
Je ne l'ai jamais essayé, et je ne connais pas tout à fait le fonctionnement interne de ToolTip, mais comme il obtient une référence au contrôle auquel un texte est lié, je suppose que cela pourrait fonctionner. Qu'une seule façon de le savoir; essayez-le: o)
Fredrik Mörk
Eh bien, je vais évidemment l'essayer. Mais je ne suis pas particulièrement doué pour trouver des choses comme des fuites de mémoire et autres ... Et si cela causait une fuite de mémoire ou quelque chose du genre, j'aimerais savoir, hehe.
Svish
8

L'info-bulle en C # est très facile à ajouter à presque tous les contrôles de l'interface utilisateur. Vous n'avez pas besoin d'ajouter d'événement MouseHover pour cela.

Voici comment faire-

  1. Ajoutez un objet ToolTip à votre formulaire. Un objet suffit pour l'ensemble du formulaire. ToolTip toolTip = new ToolTip();

  2. Ajoutez le contrôle à l'info-bulle avec le texte souhaité.

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

OupsDev
la source
1

Je l'ai fait de cette façon: ajoutez simplement l'événement à n'importe quel contrôle, définissez la balise du contrôle et ajoutez une condition pour gérer l'info-bulle pour le contrôle / balise approprié.

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
la source
-3

Abonnez-vous simplement à l'événement ToolTipTextNeeded du contrôle et renvoyez e.TooltipText, beaucoup plus simple.

Fredv
la source
6
Je ne pense pas que ce soit un événement de contrôle WinForm standard.
Dan7