2014-05-02 26 views
1

我想創建一個控件,該控件允許在設置配置控件(即設置一組屬性)時設置屬性的設計時間。理想情況下,配置類(函子),函數,甚至是配置名稱(即字符串)的實例最終是否會根據控件本身執行一些代碼。該代碼將由開發人員使用該控件編寫。他們將定義任意數量的配置,然後在設計器中,控件的屬性將顯示可接受選項的下拉列表,或允許開發人員鍵入某個值(例如配置名稱)。預期的效果是設置屬性會立即導致控件在設計器中根據其新的屬性設置重新繪製。如何使用設計時配置機制創建.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" 

...整個網格已正確配置。唯一的問題是我們不想將配置存儲在控制庫本身中。各個應用程序應該定義他們自己的配置。託管應用程序只需要將這些配置中繼到庫/網格類的方法,以便在設計器中設置上述屬性時,庫會識別配置並適當地更新設計器。

+0

這是否真的需要在設計師?你似乎想要一個編程的方式來配置一個控制...而你有這個,這是代碼隱藏。您可以在InitializeComponent()之後立即應用您喜歡的任何配置方法。 –

+0

除非你打算寫自己的設計師,我假設你想使用一些現有的設計工具。但是,您沒有指定哪個。在Visual Studio中,您有Windows窗體和WPF。 –

+0

我們的商店更喜歡在設計師中設置屬性,以便設計時間表看起來像是要看運行時間。如果我們等待運行時間來設置這些屬性,設計師將無法匹配。 – Mario

回答

0

如果我正確理解你的話,你有一個庫,包含一些公共屬性的控件,可以在設計器中設置。您希望允許庫的使用者定義標準的屬性值集,這些屬性值可以在設計時應用於控件。

您希望這樣做,因爲它非常重要,因爲設計器中的控件應該看起來與運行時相同,並且您不相信庫的使用者可以在每個屬性上正確應用控件設置基礎。

你在問什麼有一個固有的悖論,因爲你希望讓你的庫運行任意的外部代碼,甚至可能還沒有被編譯。設計器配置代碼實際上由Visual Studio進行解釋。

有幾個控制庫(例如:DevExpress XtraGrid)可以使用XML文件保存和恢復佈局。這些工作在設計時將控件的各種屬性設置爲先前保存的狀態。爲了實現這樣的事情,你必須爲你的控件製作一個設計器擴展。 This article contains documentation on how.

但實際上,你只是要經歷很多工作,實際效益很小。

一個簡單的方法就是隻需要一個片段庫,程序員可以手動將其粘貼到表單設計器生成的代碼中。

+0

我在問題的底部添加了更多信息。也許我在避免細節方面過於狹隘。 – Mario

+0

從XML文件(或您選擇的其他格式)加載列設置似乎是要走的路。查看答案,瞭解如何進行鏈接。 –

相關問題