14

Windows フォーム コントロールの Visible プロパティを true に設定しても、コントロールの親ウィンドウのいずれかが非表示になっていると、そのプロパティは false を返します。親ウィンドウが非表示の場合に、コントロールの真の基になる可視性フラグを取得する方法はありますか?

4

4 に答える 4

15

通常の実装で、コントロール スタックをチェックして、すべての親が表示されていることを確認します。これをかわす唯一の方法は、リフレクションでごまかして を求めることです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 });
于 2008-12-24T17:36:09.920 に答える
-1

リフレクションに依存しないオプションは、Visible が false に設定されているものを探して、コントロール階層の親を再帰することです。

編集:コードの意味についてはコメントを参照してください。

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

于 2008-12-24T17:48:55.153 に答える