38 votes

Comment afficher une info-bulle sur un bouton désactivé?

Si vous avez un bouton désactivé sur un formulaire, comment pouvez-vous afficher une info-bulle au survol pour informer l'utilisateur de la raison pour laquelle le bouton est désactivé?

15voto

user1172173 Points 35

Placez le bouton (ou tout contrôle qui correspond à ce scénario) dans un conteneur (panneau, tableLayoutPanel) et associez l'info-bulle à la cellule de panneau sous-jacente appropriée. Fonctionne très bien dans un certain nombre de scénarios, flexible. Astuce: rendez la cellule juste assez grande pour contenir le bttn, de sorte que la réponse au survol (affichage des info-bulles) ne semble pas "saigner" en dehors des bordures du bttn.

12voto

Sam Mackrill Points 1082

J'ai depuis adapté la réponse de BobbyShaftoe pour être un peu plus générale

Remarques:

  • L'événement MouseMove doit être défini sur le contrôle parent (un panneau dans mon cas)

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

10voto

Peter Smartt Points 83

Sam Mackrill, merci pour votre réponse, bonne idée d'utiliser la balise pour savoir quel contrôle vous quittez. Cependant, vous avez toujours besoin du drapeau IsShown selon la réponse de BobbyShaftoe. Si vous avez la souris au mauvais endroit, si l'info-bulle se trouve en dessous, elle peut déclencher un autre événement MouseMove (même si vous n'avez pas physiquement déplacé la souris). Cela peut provoquer une animation indésirable, car l'infobulle disparaît et réapparaît continuellement.

Voici mon code:

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

8voto

BobbyShaftoe Points 19925

Donc, en supposant que votre contrôle s'appelle "bouton1", vous pouvez faire quelque chose comme ça. Vous devez le faire en gérant l'événement MouseMove de votre formulaire car les événements ne seront pas déclenchés depuis votre contrôle.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X