2009-09-17 197 views
5

我已經看到有關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事件處理程序多少次?)

+0

非常有幫助,謝謝。 – 2010-08-25 17:16:18

回答

2

由於與問題使用DesignMode屬性和嵌套控件(以及相關的問題),我的這個問題的一般方法是甚至不嘗試使我的自定義UserControls在設計模式下運行。通常,我的控件非常複雜並且是自繪的,所以即使DesignMode使用嵌套控件,也需要花費大量的編程工作才能讓它們在設計模式中顯示任何有意義的內容(並且會減慢開發工作,因爲控件需要大量的初始化和設置時間)。

通常我只是添加一個執行所有工作的公共Setup()或LoadData()方法,並且只在運行時調用此方法。然後,在設計模式下,UserControl只顯示爲一個正方形,這有助於我定位它,而不再是其他任何東西。

我很感興趣,看看你是否得到了這個問題的任何其他答案,但是,這可能會解決你的問題。

+0

在設計視圖中查看自己的控件非常方便,特別是如果您想對它們進行分類。如果你不這樣做,那麼在窗體中至少要有一個控件佈局框架就好了(就像你在做的那樣)。 如果控件使用了很多標準,並且您需要修改位置,屬性或控件組件的事件處理程序,那麼逼真的設計視圖就變得非常重要。 此外,我認爲知道我的控件可以被沒有代碼的人使用是有益的:)。 – 2009-09-22 21:19:28

+0

@Sam:我完全同意你所說的一切,有時候我會試圖讓我的控件在設計模式下工作。但是,一旦遇到嚴重問題,我通常會放棄,儘管有時不夠快。 – MusiGenesis 2009-09-22 21:36:36