Как определить видимость элемента управления? - PullRequest
10 голосов
/ 12 мая 2011

У меня есть TabControl, который содержит несколько вкладок. На каждой вкладке есть одна UserControl. Я хотел бы проверить видимость элемента управления x на UserControl A с UserControl B. Я подумал, что делать x.Visible из UserControl B было бы достаточно. Как оказалось, он отображал false в отладчике, хотя я явно установил его на true, и он никогда не менялся. Затем я прочитал на MSDN для Control.Visible , что:

Даже если для Visible установлено значение true, элемент управления может быть невидим для пользователя, если он скрыт за другими элементами управления.

К моему большому удивлению, это не сработает. Теперь мне интересно, как я могу узнать, виден ли элемент управления x с другого UserControl. Я хотел бы избежать использования логического значения, если это возможно. Кто-нибудь сталкивался с этим и нашел решение?

Примечание. Также представляется, что Control.IsAccessible неверно в этой ситуации.

Ответы [ 3 ]

8 голосов
/ 12 мая 2011

К сожалению, элемент управления не предоставляет ничего общего, что позволит вам проверить это.

Одной из возможностей было бы установить что-либо в свойстве тега элемента управления. Цель тега - связать данные пользователя с элементом управления. Так что это может быть что угодно, не просто логическое значение.

Вот свойство тега 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 }));
}
0 голосов
/ 05 июля 2018

Я использую этот код не только для проверки всех видимых предков, а также того, кто является корневым элементом управления. Проверка корня необходима, когда элемент управления не добавлен в форму Mainline.

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 голосов
/ 12 мая 2011

Пожалуйста, попробуйте это:

bool ControlIsReallyVisible(Control C)
{
    if (C.Parent == null) return C.Visible;
    else return (C.Visible && ControlIsReallyVisible(C.Parent));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...