我有以下問題:我有一個基本窗體停靠在面板底部和麪板內的一些按鈕。繼承此基本表單的表單可以通過屬性顯示在子表單屬性中的「ButtonCloseVisiblity」屬性來修改基本表單按鈕的可見性。問題是,有時當子窗體刷新時(例如,當我雙擊一個事件,刪除代碼中新創建的事件並返回給設計者)時,按鈕的可見性再次設置爲它們的默認狀態。在C#中的窗體繼承#
回答
挖一個答案我來這一點,當我有獲得/從控制直接設置屬性如基本形式和使用性能:
public bool ControlVisibility
{
get{ return control.Visibility; }
set{ control.Visibility = value; }
}
當子窗體修改,這種修改沒有被持久化爲代碼,並且可見性是由基本表單定義的,因此每次打開子表單或重建項目時,繼承控件的可見性默認爲基本表單值。爲了解決這個問題,我們必須添加一個字段,並在屬性更改其值:
private bool _controlVisibility;
public bool ControlVisibility
{
get{ return _controlVisibility; }
set
{
_controlVisibility = value;
control.Visibility = value;
}
}
這樣的屬性在代碼仍然存在。
我已經使用了繼承形式,但沒有使用它們的控件。
對不起,如果你已經試過這個。
嘗試將調試消息放置在基類的各種事件中。可能會有一次觸發,您可以在設計模式下重新應用您的設置。
這很可能歸屬於基本屬性上缺少的屬性。看看this MSDN page,特別是DesignerSerializationVisibilityAttribute
。
是的,它在Visual Studio中非常頻繁地發生。將您的更改保存在子窗體構造函數中,或者在OnLoad()中執行。如果您不希望在設計模式下以子窗體顯示更改,則還可以添加以下檢查。
if(!DesignMode){
....
}
不知道我是否完全理解,但它似乎醫治,如果可見性屬性被覆蓋值?如果您在設計器文件中手動更改該值,則在下次刷新設計器文件時(例如,添加新控件時),該值將被覆蓋。
嘗試從屬性選項卡設置值,而不是在設計器文件中手動寫入。
我更改了屬性選項卡中的屬性,但它始終被覆蓋 – Argons 2010-01-14 13:59:28
對於VS中的WinForms/controls上的可視化元素的繼承並不是那麼好或不可靠 - 正如我發現我的成本!消失或重新排列的控制或覆蓋的屬性恐怕是規範。
當我研究這個問題時,MS的迴應似乎是,它太難以正確實施,並且他們沒有計劃解決它!我認爲它很多依賴於子控件中的代碼生成而不是真正的繼承。
順便說一下,DesignMode可以直接在窗體上進行控件,但如果您有窗體控件或任何更深層次的控件,則不可靠。去年我在某個時候在這裏發表了一篇關於此事的文章或答案。
你的英語很好。 – DOK 2010-01-14 13:07:17