2012-10-14 2 views
0

J'ai essayé de trouver la cause de la modification de mes tailles de ballons et du recadrage du texte. Je pensais que cela avait à voir avec la réinitialisation du texte de pointe pour un contrôle. Nan. Il s'avère que c'est l'annulation de popOpen. Une fois que vous annulez, cela affectera négativement le prochain ballon à ouvrir.ToolTip IsBalloon annule la taille du prochain ballon ouvert

Quelqu'un a des idées brillantes sur une solution de rechange?

Voici le code: (pour reproduire le bug, exécutez-le et mouseOver l3, puis l2, puis l, puis l3 - dans cet ordre).

public partial class Form7 : Form 
{ 
    private Label l, l2, l3; 

    public Form7() 
    { 
     InitializeComponent(); 

     toolTip1.IsBalloon = true; 
     toolTip1.Popup += new PopupEventHandler(toolTip1_Popup); 

     l = new Label(); 
     l.Name="l"; 
     l.Text = "Label 1"; 
     l.Top = 100; 
     l.Left = 100; 

     l2 = new Label(); 
     l2.Name="l2"; 
     l2.Text = "Label 2"; 
     l2.Top = 150; 
     l2.Left = 100; 

     l3 = new Label(); 
     l3.Name = "l3"; 
     l3.Text = "Label 3"; 
     l3.Top = 200; 
     l3.Left = 100; 

     this.Controls.Add(l); 
     this.Controls.Add(l2); 
     this.Controls.Add(l3); 

     toolTip1.SetToolTip(l, "Hello."); 
     toolTip1.SetToolTip(l2, "This is longer."); 
     toolTip1.SetToolTip(l3, "This is even longer than Label 2."); 

    } 

    void toolTip1_Popup(object sender, PopupEventArgs e) 
    { 
     Control c = e.AssociatedControl; 

     if (c.Name == "l") 
      e.Cancel = true; // <--- This is the culprit! 
     else 
      e.ToolTipSize = new Size(400, 100); // <--- This sems to have no effect when isBalloon == true. 
    } 

} 

Répondre

1

Réprimandez ces bogues de ToolTip ennuyants. Au moins une partie de la raison semble être que le contrôle Windows natif ne supporte pas l'annulation de la popup. Winforms l'émule en définissant la taille de la fenêtre de l'info-bulle sur 0 x 0 pixel. Cela semble affecter le résultat de la prochaine popup, il semble générer une taille de fenêtre qui est calculée à partir de cette taille 0 x 0 et suppose que le texte doit être enveloppé. Mais n'emballe pas le texte.

Un hack pour résoudre le problème consiste à écraser le contrôle natif après l'annulation afin qu'il ne puisse pas mémoriser la taille. Cela a fonctionné:

if (c.Name == "l") { 
     e.Cancel = true; 
     this.BeginInvoke(new Action(() => { 
      toolTip1.IsBalloon = !toolTip1.IsBalloon; 
      toolTip1.IsBalloon = !toolTip1.IsBalloon; 
     })); 
    } 
+0

Eh bien, si je pouvais voter votre réponse, je le ferais. Il dit que je n'ai pas encore assez de points de réputation. C'était une solution géniale! Pouvez-vous expliquer la nature de l'utilisation de BeginInvoke et comment cela fonctionne? J'ai essayé d'utiliser vos instructions IsBalloon sans le BeginInvoke, et naturellement, cela ne fonctionne pas. J'aimerais en savoir plus sur BeginInvoke afin de pouvoir l'utiliser dans d'autres endroits où je pourrais être coincé. – user1646737