如果將Windows窗體控件的Visible屬性設置爲true,則如果隱藏了該控件的任何父窗口,該屬性仍會返回false。有沒有辦法在父窗口隱藏的情況下獲得控件的真實底層可見性標誌?如何獲得Visible屬性的「真實」價值?
10
A
回答
13
那麼,正常執行確實檢查控制堆棧,以確保所有父母都可見。我知道的唯一辦法逃避,這是與反思作弊,並要求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 });
0
不依靠反射的選擇是通過控制的父母遞歸層次結構尋找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);
2
我所做的是暫時刪除按鈕從其父控制,以檢查它的Visible值,然後重新添加到父控件。
如果您需要您可以跟蹤子索引以重新添加它在正確的索引。
0
我對從'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的服裝屬性,該屬性爲可見/啓用屬性返回分配值,而不是依賴父容器的值。
相關問題
- 1. 屬性反射 - 如何獲得價值?
- 2. 如何在Asp.Net中獲取Visible屬性的集合/實際值
- 3. 默認情況下`IsAuthenticated`屬性如何獲得真實值?
- 4. 如何獲得散列數據的真實價值?
- 5. 如何獲得屬性值
- 6. 如何獲得屬性值
- 7. 我如何獲得自定義屬性道具的價值?
- 8. JSTL - 如何獲得價值的價值?
- 9. prestashop:如何獲得屬性的值
- 10. 如何獲得特定的屬性值?
- 11. 獲得屬性值
- 12. 獲得屬性值
- 13. 獲得屬性值
- 14. 得到確切的價值setter屬性值屬性中的ResourceDictionary
- 15. 如何在數學函數獲得真正的價值
- 16. 如何獲得價值?
- 17. 我如何獲得價值?
- 18. 如何獲得價值
- 19. 如何獲得價值
- 20. JSON_Spirit:如何獲得價值
- 21. 如何獲得屬性值的列表從類實例列表
- 22. 如何獲得c#屬性的屬性?
- 23. 獲得屬性修飾屬性的值
- 24. 如何在ItemTemplate中設置Visible屬性?
- 25. IHTMLAttribute如何獲得修剪值屬性
- 26. 如何獲得`data-listid`屬性值
- 27. 如何獲得xml屬性值
- 28. 如何獲得XML parent屬性值
- 29. 如何使用JDOM獲得屬性值
- 30. 如何獲得點擊屬性值?
謝謝,我會等待更多的答案後投票。 – Qwertie 2008-12-24 18:00:07
2是什麼?有沒有一個常數或枚舉可以用來代替? – 2008-12-24 18:12:13