Как получить «реальное» значение свойства Visible? - PullRequest
11 голосов
/ 24 декабря 2008

Если для свойства Visible элемента управления Windows Forms установлено значение true, это свойство по-прежнему возвращает значение false, если какое-либо из родительских окон элемента управления скрыто. Есть ли способ получить истинный базовый флаг видимости элемента управления, если родительское окно скрыто?

Ответы [ 4 ]

13 голосов
/ 24 декабря 2008

Ну, обычная реализация делает проверку стека управления, чтобы убедиться, что все родители видны. Единственный способ избежать этого, который я знаю, - это обмануть с помощью отражения и попросить GetState(2), но это хрупко:

    // dodgy; not recommended
    Panel query;
    Form form = new Form
    {
        Controls = {
            new Panel {
                Visible = false,
                Controls = {
                    (query = new Panel {Visible = true})
                }
            }
        }
    };
    form.Show();

    // this is the dodgy bit...
    bool visible = (bool)typeof(Control)
        .GetMethod("GetState", BindingFlags.Instance | BindingFlags.NonPublic)
        .Invoke(query, new object[] { 2 });
2 голосов
/ 14 февраля 2014

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

Если вам нужно, вы можете отследить дочерний индекс, чтобы повторно добавить его в нужный индекс.

0 голосов
/ 22 октября 2016

У меня та же проблема с классами, производными от базового класса ToolStripItem. поэтому я использовал значение Доступное свойство, чтобы проверить, будет ли отображаться элемент или нет. задача решена. Пример:

ToolStripItem curItm = menuStrip1.Items[i] as ToolStripItem;
if(curItm is ToolStripItem && curItm.Available) DoAnyThing();

В этом примере curItm является экземпляром производного класса ToolStripItem.

Эта проблема со свойствами Visible / Enabled в элементах управления .Net, которые зависят от Visible / Enabled родительского контейнера, должна быть решена командой .Net. Я создаю свойство костюма с именем IsVisible / IsEnabled в своих собственных классах, которое возвращает назначенное значение для свойств Visible / Enabled, а не значение, которое зависит от родительского контейнера.

0 голосов
/ 24 декабря 2008

Опция, которая не зависит от рефлексии, состоит в том, чтобы выполнить поиск через родителей иерархии элементов управления, ища тот, для которого Visible установлен в false.

РЕДАКТИРОВАТЬ: См. Комментарии для значения кода.

</p> <pre>var frm2 = new Form {Text = "Form2"}; var lbl = new Label {Visible = true}; frm2.Controls.Add(lbl); frm2.Show(); var frm1 = new Form {Text = "Form1"}; var lblVis = new Label { Text = lbl.Visible.ToString(), Left = 10, Top = 10}; lbl.VisibleChanged += (sender, args) => MessageBox.Show("Label Visible changed"); var btnShow = new Button {Text = "Show", Left = 10, Top = lblVis.Bottom + 10}; btnShow.Click += (sender, args) => { frm2.Visible = true; lblVis.Text = lbl.Visible.ToString(); }; var btnHide = new Button {Text = "Hide", Left = 10, Top = btnShow.Bottom + 10}; btnHide.Click += (sender, args) => { frm2.Visible = false; lblVis.Text = lbl.Visible.ToString(); }; frm1.Controls.AddRange(new Control[] {lblVis, btnShow, btnHide}); Application.Run(frm1);

...