我有一个包含多个标签的TabControl
。每个标签上都有一个UserControl
。我想检查来自x
UserControl
的{{1}} A
上的控件UserControl
的可见性。我认为从B
x.Visible
做UserControl
就足够了。事实证明,它在调试器中显示B
,即使我将其显式设置为false
并且它从未更改过。然后我在MSDN上阅读了Control.Visible:
即使Visible设置为true,如果用户在其他控件后面隐藏,控件可能也不会显示。
令我惊讶的是,这不会奏效。现在我想知道如何从不同的true
看出控件x
是否可见。如果可能的话,我想避免使用布尔值。有没有人碰到这个并找到了解决方案?
注意:在这种情况下,UserControl
似乎也是假的。
答案 0 :(得分:8)
不幸的是,控件没有提供任何公开信息,可以让你检查一下。
一种可能性是在控件'Tag'属性中设置一些内容。标签的目的是将用户数据与控件相关联。所以它可以是任何不仅仅是布尔值。
如果你真的想要蛮力方式,可以使用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;
}
}