如何识别控件的可见性是不是被用户更改?

Posted

技术标签:

【中文标题】如何识别控件的可见性是不是被用户更改?【英文标题】:How to identify whether visibility of the control is changed by user or not?如何识别控件的可见性是否被用户更改? 【发布时间】:2015-02-20 04:31:46 【问题描述】:

我的用户控件继承了System.Windows.Forms.Control 类。以下链接描述了控件的“可见”属性 Control.Visible

根据上面的链接,如果控件存在于非活动选项卡中,即使我们没有以编程方式设置它,Control.Visible 也会返回 false

问题: 如何确定可见性是否被用户或其他控件禁用?

注意: 我尝试覆盖 ContorlVisible 属性,但它不可覆盖。

说明

如果我的控件存在于未选择的选项卡中,则 Control.Visible 返回 false。如果用户想在Bitmap 或其他东西中绘制控件(导出),我还需要确定子控件的可见性。由于我的控件不可见,因此没有可靠的方法来确定子控件的可见性

【问题讨论】:

【参考方案1】:

Windows 窗体中的所有控件都在内部保持其状态。可见性也是他们保持状态的事情之一。因为它有助于确定控件的可见性发生更改的原因。

Control.Visible 将返回 false 如果您的上方有控件 控件或控件的父级被隐藏。但可见的价值 只有当用户将其设置为 false 时,state 中的属性才会为 false。

代码:

        //Method to ensure the visibility of a control
        public bool DetermineVisibility(Control control)
        
            //Avoid reflection if control is visible
            if (control.Visible)
                return true;

            //Find non-public GetState method of control using reflection
            System.Reflection.MethodInfo GetStateMethod = control.GetType().GetMethod("GetState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

            //return control's visibility if GetState method not found
            if (GetStateMethod != null)     
                //return visibility from the state maintained for control
                return (bool)(GetStateMethod.Invoke(control, new object[]  2 ));
            return false;
        

【讨论】:

以上是关于如何识别控件的可见性是不是被用户更改?的主要内容,如果未能解决你的问题,请参考以下文章

UWP / C#基于NavView模式更改控件可见性

一个用户控件对另一个用户控件的可见性

如何处理自定义 android 视图/小部件的可见性更改

Django 管理站点,更改不同用户的模型可见性

动态换出或切换控件的可见性

Silverlight 4:如何切换控件可见性