2014-05-02 31 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文件(或您选择的其他格式)加载列设置似乎是要走的路。查看答案,了解如何进行链接。 –

相关问题