2009-06-12 9 views
2

J'ai récemment rencontré la situation suivante. J'ai un UserControl qui peut montrer une boîte à outils modale. Si l'utilisateur a montré la boîte à outils, j'aimerais la masquer et l'afficher de façon appropriée car le UserControl lui-même devient invisible ou visible, respectivement. Le UserControl peut être incorporé dans un nombre arbitraire de conteneurs parents, tels qu'un GroupBox ou un TabPage, ce qui peut influencer si le UserControl est réellement visible malgré sa propre propriété Visible étant .Meilleur moyen de masquer une boîte à outils associée à un UserControl dans .NET 2.0?

Dans WPF, il semble que je pourrais utiliser l'événement IsVisibleChanged du UserControl pour gérer cela. Y a-t-il un équivalent pour WinForms? Que serait une solution générale dans .NET 2.0?

EDIT: Voici la solution à laquelle je suis arrivé. Y a-t-il une meilleure solution?

public partial class MyControl : UserControl 
{ 
    private List<Control> _ancestors = new List<Control>(); 
    private bool _isVisible = false; 

    public MyControl() 
    { 
     InitializeComponent(); 

     ParentChanged += OnParentChanged; 
     VisibleChanged += OnVisibleChanged; 
    } 

    private void OnParentChanged(object sender, EventArgs e) 
    { 
     foreach (Control c in _ancestors) 
     { 
      c.ParentChanged -= OnParentChanged; 
      c.VisibleChanged -= OnVisibleChanged; 
     } 

     _ancestors.Clear(); 

     for (Control ancestor = Parent; ancestor != null; ancestor = ancestor.Parent) 
     { 
      ancestor.ParentChanged += OnParentChanged; 
      ancestor.VisibleChanged += OnVisibleChanged; 

      _ancestors.Add(ancestor); 
     } 
    } 

    private void OnVisibleChanged(object sender, EventArgs e) 
    { 
     bool isVisible = Visible; 
     foreach (Control c in _ancestors) 
     { 
      if (!c.Visible) 
      { 
       isVisible = false; 
       break; 
      } 
     } 

     if (isVisible != _isVisible) 
     { 
      _isVisible = isVisible; 

      // Control visibility has changed here 
      // Do something 
     } 
    } 
} 

Répondre

0

Malheureusement, lorsque vous travaillez avec de multiples formes ou des contrôles, des propriétés comme Visible exigent que vous les définir manuellement. C'est pénible et fastidieux de passer en revue tous les contrôles dont les propriétés dépendent des propriétés des autres contrôles. Et si vous définissiez UserControl.Tag pour référencer votre boîte à outils, que se passe-t-il?

+0

J'accepte ceci parce qu'il ne semble y avoir aucune alternative à la vérification de la visibilité moi-même. Je n'ai pas utilisé Tag. – Eric

Questions connexes