我已經看到有關Forms和UserControls的DesignMode屬性的多個帖子和問題。這個想法是,您想要檢查控件是否處於設計模式(例如,控件顯示在Visual Studio Designer中),並避免只能在運行時運行的代碼。 我見過的許多問題 - 最近我的失敗內存也暴露了我 - 它是DesignMode屬性在構造函數中不起作用,並且不適用於嵌套控件。 但是,它在您的控件或窗體的Load事件處理程序中工作得非常好!使用DesignMode屬性與LicenseManager.UsageMode
當您考慮它時,Forms或UserControls的構造函數中的代碼只應處理不需要加載表單的狀態。 處理UI對象初始化的代碼應該位於控件的Load事件處理程序中。在該功能中,DesignMode屬性起作用。設計師將在當時使用其適當的價值。
原則上,InitializeComponent()方法已被調用,但實際上,當您在Design視圖中顯示控件時,Designer僅解析該函數,但它不會運行它。然而,Designer卻運行嵌套控件的構造函數。 如果您絕對需要將初始化代碼放入構造函數中,請使用System.ComponentModel.LicenseManager類,它具有一個名爲UsageMode的靜態屬性,該屬性接受DesignTime或RunTime的值。你可以絕對相信在你的控件的構造函數中的屬性 - 但只在構造函數中!
我已經忘記了我目前正在使用的應用程序中的一點微妙之處。爲了解決這個問題,我現在堅持一種模式,即所有需要額外初始化的控件和表單都必須爲Load事件實現一個處理程序。在那裏,DesignMode屬性工作得很好,我從來沒有在Designer中打開我的用戶控件和表單。
如果我有一個類層次結構,我有時會讓該事件處理程序虛擬保護,並且只有在子類需要額外的初始化時纔會覆蓋它。
我不知道,不過,如果有更好的方法,在那裏,或者如果有什麼臭這個模式(其它具有實現Load事件處理程序多少次?)
非常有幫助,謝謝。 – 2010-08-25 17:16:18