如何确定控件的可见性?

时间:2011-05-12 15:20:36

标签: c# winforms .net-3.5 controls visibility

我有一个包含多个标签的TabControl。每个标签上都有一个UserControl。我想检查来自x UserControl的{​​{1}} A上的控件UserControl的可见性。我认为从B x.VisibleUserControl就足够了。事实证明,它在调试器中显示B,即使我将其显式设置为false并且它从未更改过。然后我在MSDN上阅读了Control.Visible

  

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

令我惊讶的是,这不会奏效。现在我想知道如何从不同的true看出控件x是否可见。如果可能的话,我想避免使用布尔值。有没有人碰到这个并找到了解决方案?

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

3 个答案:

答案 0 :(得分:8)

不幸的是,控件没有提供任何公开信息,可以让你检查一下。

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

Here is the Tag property 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 }));
}

答案 1 :(得分:0)

请试试这个:

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

答案 2 :(得分:0)

我正在使用此代码,不仅检查所有可见的祖先,而且检查谁是根控件。当不在主窗体上添加控件时,需要检查根目录。

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