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é?
Réponses
Trop de publicités?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.
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; } } }
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;
}
}
}
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;
}
}