我想创建一个控件,该控件允许在设置配置控件(即设置一组属性)时设置属性的设计时间。理想情况下,配置类(函子),函数,甚至是配置名称(即字符串)的实例最终是否会根据控件本身执行一些代码。该代码将由开发人员使用该控件编写。他们将定义任意数量的配置,然后在设计器中,控件的属性将显示可接受选项的下拉列表,或允许开发人员键入某个值(例如配置名称)。预期的效果是设置属性会立即导致控件在设计器中根据其新的属性设置重新绘制。如何使用设计时配置机制创建.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