4 votes

C# WinForms: Comment savoir/détecter si l'infobulle est affichée/visible

J'ai créé une info-bulle. Cette info-bulle s'affiche lorsque la souris survole une icône en appelant la méthode show de l'info-bulle. Je veux savoir si cette info-bulle est actuellement affichée. Comment faire? Peut-être par réflexion?

System.Reflection.FieldInfo fi = typeof(ToolTip).GetField("window", BindingFlags.NonPublic | BindingFlags.Instance);
fi.GetValue(someObject...) ...

et ensuite peut-être demander si visible?

3voto

KeithS Points 36130

La classe ToolTip déclenche son événement Popup juste avant de commencer à afficher l'info-bulle. Vous pouvez considérer cela comme le début de la période pendant laquelle l'info-bulle est affichée. La fin de cette période est l'une des deux choses; un événement MouseLeave sur le contrôle pour lequel l'info-bulle était affichée, indiquant que l'utilisateur ne pointe plus la souris sur ce que vous montriez avec l'info-bulle, ou le passage de la période AutoPopDelay de l'info-bulle après laquelle le ballon disparaîtra.

Donc, vous pouvez gérer cela avec du code dans votre Formulaire ou un autre contrôle contenant l'info-bulle, ressemblant à ceci:

private System.Windows.Forms.Timer ToolTipTimer = new Timer();

public MyControl()
{
    myToolTip.Popup += ToolTipPopup;
    ToolTipTimer.Tick += ToolTipTimerTick;
    ToolTipTimer.Enabled = false;
}

private bool IsToolTipShowing { get; set; }

private Control ToolTipControl { get; set; }

private void ToolTipPopup(object sender, PopupEventArgs e)
{
   var control = e.AssociatedControl;

   //facultativement vérifier si nous sommes intéressés par la surveillance de l'info-bulle de ce contrôle   

   ToolTipControl = control;
   ToolTipControl.MouseLeave += ToolTipMouseLeave;
   ToolTipAutoPopTimer.Interval = myToolTip.AutoPopDelay;
   ToolTipTimer.Start(); 
   IsToolTipShowing = true;
}

//maintenant l'une de ces deux choses devrait arriver pour arrêter l'affichage de l'info-bulle sur le contrôle actuellement surveillé
public void ToolTipTimerTick(object sender, EventArgs e)
{
   StopToolTip();
}

public void ToolTipMouseLeave(object sender, EventArgs e)
{
   StopTimer();
}

private void StopTimer()
{
   IsToolTipShowing = false;
   ToolTipTimer.Stop();
   ToolTipControl.MouseLeave -= ToolTipMouseLeave;
}

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