我最近遇到了以下情况。我有一个
UserControl
可以显示无模式工具箱。如果用户显示了工具箱,我希望将其适当地隐藏并显示为
用户控制
自身分别变得不可见或可见。这个
用户控制
可以嵌入任意数量的父容器中,例如
GroupBox
或
TabPage
,这会影响
用户控制
实际上是可见的,尽管它本身
Visible
财产存在
True
.
在WPF中,我似乎可以使用
IsVisibleChanged
事件
用户控制
来处理这件事。是否有WinForms的等效项?.NET 2.0中的一般解决方案是什么?
编辑:这是我找到的解决方案。有更好的解决方案吗?
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
}
}
}