如何确定控件的可见性?

我有一个包含几个选项卡的TabControl 。 每个选项卡上都有一个UserControl 。 我想检查来自UserControl B UserControl A上的UserControl x的可见性。 我认为从UserControl Bx.Visible就足够了。 事实certificate,它在调试器中显示为false ,即使我将其明确设置为true并且从未更改过。 然后我在MSDN上阅读Control.Visible :

即使Visible设置为true,如果用户在其他控件后面隐藏,控件也可能无法显示。

令我惊讶的是,这无济于事。 现在我想知道如何判断控件x是否可以从不同的UserControl看到。 如果可能的话,我想避免使用布尔值。 有没有人碰到这个并找到了解决方案?

注意:在这种情况下, Control.IsAccessible似乎也是假的。

不幸的是,控件没有提供任何公开的内容,可以让你检查这个。

一种可能性是在控件’Tag’属性中设置一些东西。 标签的目的是将用户数据与控件相关联。 所以它可以是任何东西,而不仅仅是一个布尔值。

这是Tag属性doc

如果你真的想要蛮力方式,可以使用Reflection,基本上调用GetState(2):

 public static bool WouldBeVisible(Control ctl) { // Returns true if the control would be visible if container is visible MethodInfo mi = ctl.GetType().GetMethod("GetState", BindingFlags.Instance | BindingFlags.NonPublic); if (mi == null) return ctl.Visible; return (bool)(mi.Invoke(ctl, new object[] { 2 })); } 

请试试这个:

 bool ControlIsReallyVisible(Control C) { if (C.Parent == null) return C.Visible; else return (C.Visible && ControlIsReallyVisible(C.Parent)); } 

我正在使用此代码,不仅检查所有可见的祖先以及谁是根控件。 如果未在Mainform上添加控件,则需要检查根。

 public static class StratoControlExtension { public static bool TruelyVisible(this Control control, Control expected_root) { if (control.Parent == null) { return control == expected_root && control.Visible; } return control.Parent.TruelyVisible(expected_root) && control.Visible; } }