代码之家  ›  专栏  ›  技术社区  ›  Eric

在.NET 2.0中隐藏与UserControl关联的工具箱的最佳方法是什么?

  •  2
  • Eric  · 技术社区  · 15 年前

    我最近遇到了以下情况。我有一个 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
            }
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   IAbstract    14 年前

    不幸的是,当使用多个窗体或控件时,属性 Visible 要求手动设置它们。对所有属性依赖于其他控件属性的控件进行检查是一种痛苦,而且有点乏味。

    如果将usercontrol.tag设置为引用工具箱怎么办?