我想創建一個控件,該控件允許在設置配置控件(即設置一組屬性)時設置屬性的設計時間。理想情況下,配置類(函子),函數,甚至是配置名稱(即字符串)的實例最終是否會根據控件本身執行一些代碼。該代碼將由開發人員使用該控件編寫。他們將定義任意數量的配置,然後在設計器中,控件的屬性將顯示可接受選項的下拉列表,或允許開發人員鍵入某個值(例如配置名稱)。預期的效果是設置屬性會立即導致控件在設計器中根據其新的屬性設置重新繪製。如何使用設計時配置機制創建.NET控件?
Public Property Configuration As String
Get
Return m_Configuration
End Get
Set(value As String)
m_Configuration = value
Dim Configure As Action(Of CustomControl) = Configurations(value)
Configure(Me) //apply custom code written by user of library
End Set
End Property
我試圖創建和加載與配置(在上面的代碼位使用)的共享詞典,但我沒能找到一種方法,讓字典由開發人員,使加載了在設計器中設置上述屬性時,配置將已經在字典中。如果我在庫本身中定義了配置,它會起作用,但這會破壞定製的目的。
//Where and how would the developer cause this to be executed...
Configurations.Add("DoSomethingWonderful", AddressOf DoSomethingWonderful)
//...so that it would be in place for use at design time?
Me.CustomControl.Configuration = "DoSomethingWonderful"
我試圖使該財產的Action(Of CustomControl)
和揭露一些全球性的行動,但設計師並沒有讓這個屬性進行設置。我曾希望該屬性將顯示已知Action(Of CustomControl)
方法的列表。
Me.CustomControl.Configuration = AddressOf DoSomethingWonderful
我試圖使該屬性採取的結構類(即a functor)的一個共享的實例,但設計師不允許此屬性,以任一組。同樣,我希望該屬性會顯示已知配置實例的列表。
Me.CustomControl.Configuration = DoSomethingWonderful 'configuration instance
從自定義控件繼承不是一個選項。繼承和重載配置類將會很好。理想情況下,我遵循符合要求的最簡單方法。如果我們等到運行時間,所有這些方法都可以工作,但關鍵是我們在設計時有一些工作。
具體來說,我們有一個自定義的網格控件,我們在其中定義了大量的列和設置。我們通常需要顯示具有預定義的一組列和設置的地址網格。地址網格在整個應用程序的幾個地方使用。我們有其他這樣的網格,它們具有在應用範圍內使用的預定義列和設置。開發人員開始將網格從屏幕上覆制並粘貼到屏幕上。這是有道理的,因爲管理層不希望我們繼承不同的基礎網格風格(例如AddressGrid,PersonGrid等)。問題是,當我們改變我們顯示地址的方式時,我們必須重新配置應用程序中的所有地址網格。我現在正在工作,所以如果你...
Me.Addresses.Configuration = "Address"
...整個網格已正確配置。唯一的問題是我們不想將配置存儲在控制庫本身中。各個應用程序應該定義他們自己的配置。託管應用程序只需要將這些配置中繼到庫/網格類的方法,以便在設計器中設置上述屬性時,庫會識別配置並適當地更新設計器。
這是否真的需要在設計師?你似乎想要一個編程的方式來配置一個控制...而你有這個,這是代碼隱藏。您可以在InitializeComponent()之後立即應用您喜歡的任何配置方法。 –
除非你打算寫自己的設計師,我假設你想使用一些現有的設計工具。但是,您沒有指定哪個。在Visual Studio中,您有Windows窗體和WPF。 –
我們的商店更喜歡在設計師中設置屬性,以便設計時間表看起來像是要看運行時間。如果我們等待運行時間來設置這些屬性,設計師將無法匹配。 – Mario