如何使用设计时配置机制创建.NET控件?

时间:2014-05-02 13:21:13

标签: .net vb.net custom-controls design-time

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

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"

...整个网格配置正确。唯一的问题是我们不希望将配置存储在控件库本身中。各个应用程序应该定义自己的配置。托管应用程序只需要一种将这些配置中继到库/网格类的方法,这样当在设计器中设置上述属性时,库就会识别配置并适当地更新设计器。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你有一个库,它包含一些具有一些公共属性的控件,可以在设计器中设置。您希望允许库的使用者定义标准的属性值集,这些属性值可以在设计时应用于控件。

您希望这样做,因为设计器中的控件应该与运行时的控件看起来非常重要,并且您不相信库的使用者可以基于每个属性正确应用控件设置

你要问的是一个固有的悖论,因为你希望让你的库运行任意外部代码,甚至可能还没有编译。设计器配置代码实际上由Visual Studio解释。

有一些控件库(例如:DevExpress XtraGrid)可以使用XML文件保存和恢复布局。它们在设计时工作,将控件的各种属性设置为先前保存的状态。为了实现这样的东西,你必须为你的控件做一个设计师扩展。 This article contains documentation on how.

但实际上,你只是为了实际的利益而经历了大量的工作。

围绕这个的一个方法就是只有一个程序员可以手动粘贴到表单设计器生成的代码中的片段库。