开发者

How do I determine visibility of a control?

开发者 https://www.devze.com 2023-03-05 05:08 出处:网络
I have a TabControl that contains s开发者_Go百科everal tabs. Each tab has one UserControl on it.I would like to check the visibility of a control x on UserControl A from UserControl B.I figured that d

I have a TabControl that contains s开发者_Go百科everal tabs. Each tab has one UserControl on it. I would like to check the visibility of a control x on UserControl A from UserControl B. I figured that doing x.Visible from UserControl B would be good enough. As it turns out, it was displaying false in the debugger even though I set it explicitly to true and it was never changed. Then I read on MSDN for Control.Visible that:

Even if Visible is set to true, the control might not be visible to the user if it is obscured behind other controls.

So much to my surprise, that will not work. Now I'm wondering how I can tell if the control x is visible from a different UserControl. I would like to avoid using a boolean if possible. Has anyone run into this and found a solution?

Note: It also appears that Control.IsAccessible is false in this situation.


Unfortunately the control doesn't provide anything public that will allow you to check this.

One possibility would be to set something in the controls 'Tag' property. The tag’s purpose is to associate user data with the control. So it can be anything not just a boolean.

Here is the Tag property doc

If you really want the brute force way, you can use Reflection, basically calling 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 }));
}


Please try this:

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


I'm using this code not only checking all the ancestors visible and also who is the root control. Checking a root is needed when the control is not added on the 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;
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号