2010-04-16 46 views
4

我需要找到一種方法來確定控件的Visible屬性是通過屬性更改設置的,還是通過屬性更改來繼承它的值家長。使用Reflector,我發現函數this.GetVisibleCore()和this.GetState()都是內部方法,所以我不能調用它們。如何確定Control.Visible是通過屬性設置還是值被繼承

窗口小部件本身是動態創建的,所以我不想在創建每個窗口小部件之後將方法附加到VisibleChanged事件,因此可以嘗試監視此屬性。如果我必須,我想我會但是我正在尋找更優雅的東西。

編輯

當我隱藏的形式,去關閉它或建立的形式,但掩蓋它。我真正想知道的是,什麼可見的值是假的,因爲形式是隱藏的,什麼樣的價值觀是錯誤的因爲它們被設置爲假。再次,我不想爲每個Widget的每個VisibleChanged事件添加一個方法。我只是想以某種方式從Control對象讀取它。

+0

非常不清楚。你想知道Visible屬性是否被覆蓋? – 2010-04-16 22:10:36

+0

不,我想知道何時設置了Visible屬性。當窗體本身被隱藏或者尚未顯示時,所有控件可見屬性都爲false。當表單可見時,所有可見屬性都切換爲true,除非在代碼中將其設置爲false。隱藏表單並且Visible屬性變爲false。我想知道的是如何確定Control是否設置了Visible屬性,並且它的值是多少,而不管它作爲兒童分配給它的表單/容器的Shown/Hidden狀態。 – JDMX 2010-04-16 22:22:41

+0

也許你可以創建一個輔助函數,循環遍歷所有的控件來創建一個包含所有可見控件的數組。然後,您可以使用此列表來顯示/隱藏表單控件,無論加載後發生了什麼變化。我假設你只是希望能夠顯示/隱藏自定義表單。 – Zachary 2010-04-16 23:14:58

回答

2

它仍然不是很清楚,但我認爲問題在於Visible屬性getter返回控件的實際可見性狀態。這不僅是Visible的最後分配值,還考慮了控件的父母是否可見。換句話說,如果你在UserControl中有一個按鈕,並且UserControl的Visible = false,那麼按鈕的Visible也會一直爲false。

您可以覆蓋SetVisibleCore(),以找出是否控制打算可見:

public bool CouldBeVisible { get; set; } 

protected override void SetVisibleCore(bool value) { 
    CouldBeVisible = value; 
    base.SetVisibleCore(value); 
} 
+0

我希望能達到實際價值,但我想這可以工作。我看到的唯一缺點是我需要創建一個自定義窗口小部件,它繼承自我想跟蹤Visible屬性(Form,Textbox,Label,MenuItem等)的基本窗口小部件,並且我需要確定CouldBeVisible的值需要分配給Visible屬性。 – JDMX 2010-04-20 15:12:03

相關問題