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