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