Visual Studio .NET 2005 设计时集成






4.35/5 (34投票s)
2006年2月15日
9分钟阅读

159924
Visual Studio .NET 2005 设计时架构和集成概述

引言
本文概述了 VS.NET 2005 设计时集成支持。本文重点介绍了 .NET 设计时架构,并详细讨论了设计时属性和各种设计时组件,其中以 Web 控件为例。本文还列出了为项目添加设计时支持所需的引用和命名空间。
设计时属性
属性将组件与设计时组件关联起来。这种关联可以在组件类型级别以及组件成员级别完成。设计时属性根据关联类型大致分为两类
- 类型级别属性
- 成员级别属性
类型级别属性
类型级别属性将组件类型与其他组件关联起来。类型级别属性在类声明之前指定。以下代码显示了类 MyTextBox
的类型级别关联。
[DefaultProperty("Text")]
[DefaultEvent("OnChange")]
public class MyTextBox : TextBox
{
public MyTextBox()
{
}
}
在上述代码中,设计时属性 DefaultProperty
指定了类的默认属性,当用户单击组件时,该属性在属性网格中显示为选中状态。同样,设计时属性 DefaultEvent
指定了类的默认事件。
成员级别属性
成员级别属性将组件的成员与其他组件关联起来。成员级别属性在属性定义之前指定。以下代码显示了属性 Text
的成员级别关联。
true)>
[Category("Appearance")]
[DefaultValue("")]
[Description("Gets/Sets the text value.")]
public string Text
{
...
}
在上述代码中,设计时属性 Browsable
指定该属性是否在属性网格中可见。属性 Category
指定该属性在属性网格中显示的类别。属性 DefaultValue
指定该属性的默认值,而属性 Description
指定该属性的简要文本,该文本显示在属性网格描述面板中。组件可以为类型和成员指定多个属性。
设计时组件
设计时组件是扩展设计时行为的组件。这些组件利用设计时环境,提供扩展的设计时功能,以自定义组件行为和用户界面。.NET Framework 提供了以下三种基本设计时组件
- 设计师
- 类型转换器
- UI 类型编辑器
设计师
设计器提供在设计时自定义组件行为的支持。设计器可以被视为一个帮助类,它提供一组属性和方法来自定义组件的设计时行为。设计器提供以下支持。
- 允许为自定义控件指定设计时 HTML。
- 允许添加、删除或覆盖控件的现有属性。
- 允许从上下文菜单或操作列表中指定和执行某些控件方法/属性。
- 允许为数据绑定控件指定设计时数据源。
- 允许使用设计时 WYSIWYG 编辑器修改控件模板。
- 允许为复合控件的子控件指定数据绑定。
下图显示了 .NET Framework DropDownList
控件的设计时外观。设计器 ListControlDesigner
指定了一些设计时属性/方法,例如“选择数据源...”、“编辑项...”、“启用自动回发”等,并将它们显示在操作列表中。设计器将这些属性链接到控件属性,并允许用户从操作列表中设置它们。

下图显示了 .NET Framework DataList
控件的 ItemTemplate
的设计时编辑。设计器 DataListDesigner
为模板编辑提供了 WYSIWYG 编辑器。设计器还允许用户为模板子控件指定数据绑定。

.NET Framework 为几乎所有的服务器控件都提供了设计器类。例如:设计器 HyperLinkDesigner
为 HyperLink
控件提供设计时支持,设计器 ListControlDesigner
为 DropDownList
控件提供支持,设计器 DataListDesigner
为 DataList
控件提供支持。其他一些常见的设计器类包括 LabelDesigner、CheckBoxDesigner、LinkButtonDesigner、DataGridDesigner、PanelDesigner、TableDesigner、MenuDesigner 等。所有这些设计器类都派生自基类 ControlDesigner
。这些设计器类可以使用设计时属性轻松地链接到自定义控件。
[DesignerAttribute(typeof(DataListDesigner))]
public class MyList : DataList
{
public MyList()
{
}
}
上述代码显示了使用设计时属性 DesignerAttribute
将自定义控件 MyList
链接到设计器 DataListDesigner
。
类型转换器
类型转换器,顾名思义,提供支持在组件设计支持的数据类型和组件可以相互转换值的数据类型之间转换属性值。类型转换器提供以下支持。
- 在属性网格中设计时配置属性值。
- 在属性网格中列出属性的标准值。
- 在属性网格中对属性值进行数据类型验证。
- 生成初始化代码以在设计时初始化属性。
VS.Net 属性网格允许在设计时配置属性值。由于属性浏览器只允许输入 string
值,因此应该有一些机制将这些字符串值转换为属性的适当数据类型。这种机制由类型转换器提供。它们还提供支持在属性网格中列出属性的标准值。
下图显示了属性网格中属性 Font
的设计时配置。该图还显示了属性 Size
的标准值,以下拉列表的形式显示在属性网格中。

类型转换器还在属性网格中对属性值执行类型验证,以确保正确的类型转换。例如,如果用户输入一个无效值,例如一个 string
值作为 int
类型的属性,那么属性网格将显示以下验证消息。

.NET Framework 几乎为所有基本数据类型提供了类型转换器类。例如:类 ArrayConverter
为 Array
数据类型提供类型转换支持,类 BooleanConverter
为 bool
数据类型提供支持,类 DateTimeConverter
为 DateTime
数据类型提供支持。其他一些常见的类型转换器类包括 ByteConverter、CharConverter、DecimalConverter、DoubleConverter、Int16Converter、Int32Converter、EnumConverter 等。所有这些类型转换器类都派生自基类 TypeConverter
。这些类型转换器类可以使用设计时属性轻松地链接到自定义控件。
[TypeConverterAttribute(typeof(StringArrayConverter))]
public string[] Items
{
...
}
上述代码显示了使用设计时属性 TypeConverterAttribute
将控件属性 Items
链接到类型转换器类 StringArrayConverter
。StringArrayConverter 是 .NET 2.0 中提供的一个新类,它提供一个类型转换器,用于将逗号分隔的字符串值转换为字符串数组,反之亦然。因此,此类型转换器允许用户在属性网格中为 string[]
类型的属性 Items
指定逗号分隔的值。
UI 类型编辑器
UI 类型编辑器提供自定义用户界面,用于在设计时显示和编辑属性的值。此自定义用户界面可以是属性网格中显示的下拉列表,也可以是作为模型对话框显示的 Windows 窗体。UI 类型编辑器是类型特定的,只能显示或编辑其支持的类型的值。UI 类型编辑器提供以下支持。
- 提供自定义 UI 以在设计时表示属性值。
- 将属性值作为下拉列表显示在属性网格中。
- 配置其支持类型的属性值。
下图显示了类型为 ListItemCollection
的某个属性的设计时表示,以 Windows 窗体对话框的形式显示。该图显示了集合中每个列表项的完整详细信息,并允许用户仅在模型对话框中进一步编辑单个列表项属性。不可能在属性网格中表示此类属性值,因此编辑器提供了扩展功能,可以使用自定义用户界面表示此类属性值。

.NET Framework 为一些常见的组件属性类型提供了编辑器类。例如:编辑器类 ArrayEditor
为 Array
类型的属性值提供 UI,类 CollectionEditor
为 Collection
类型的属性提供 UI,类 DateTimeEditor
为 DateTime
类型的属性提供 UI。其他一些常见的编辑器类包括 MultilineStringEditor、ImageUrlEditor、ConnectionStringEditor、XmlUrlEditor、DataGridColumnCollectionEditor、ListItemsCollectionEditor 等。所有这些编辑器类都派生自基类 UITypeEditor
。这些编辑器类可以使用设计时属性轻松地链接到自定义控件。
以下代码显示了使用设计时属性 EditorAttribute
将自定义控件的 ListItemCollection
类型的属性 Items
链接到编辑器 ListItemsCollectionEditor
。
[EditorAttribute(typeof(ListItemsCollectionEditor), typeof(UITypeEditor))]
public ListItemCollection Items
{
...
}
为项目添加设计时支持
为项目添加设计时支持需要向项目中添加一些引用并在相关代码文件中包含某些命名空间。以下部分列出了设计时支持所需的引用和命名空间
- 为了为组件提供设计时支持,您需要向项目中添加对 .NET Framework 程序集
System.Design.dll
的引用。 -
要使用 .NET Framework 现有的设计时属性,请在相关代码文件中包含命名空间
System.ComponentModel
。它允许您使用所有设计时属性,如 EditorAttribute、DesignerAttribute、TypeConverterAttribute 等。要为您的 Web 控件创建新的自定义设计时属性,您必须派生自基类
Attribute
。此基类存在于System
命名空间的根级别。 -
要使用现有 Web 控件的 .NET Framework 设计器类,请在相关代码文件中包含命名空间
System.Web.UI.Design.WebControls
。它允许您使用现有的设计器类,如 ButtonDesigner、LabelDesigner、CheckBoxDesigner、DataGridDesigner、PanelDesigner、MenuDesigner 等。要为您的 Web 控件创建新的自定义设计器类,您必须派生自基类
ControlDesigner
。此基类存在于System.Web.UI.Design
命名空间中。 -
要使用现有数据类型的 .NET Framework 类型转换器类,请在相关代码文件中包含命名空间
System.ComponentModel
。它允许您使用现有的类型转换器类,如 ByteConverter、CharConverter、DecimalConverter、Int16Converter、Int32Converter 等。要为您的属性创建新的自定义类型转换器类,您必须派生自基类
TypeConverter
。此基类存在于System.ComponentModel
命名空间中。 -
要使用现有数据类型的 .NET Framework 编辑器类,请在相关代码文件中包含命名空间
System.ComponentModel.Design
。它允许您使用现有的编辑器类,如 CollectionEditor、DateTimeEditor 等。一些 Web 控件常见的编辑器类存在于System.Web.UI.Design
命名空间中,如 ImageUrlEditor、XmlUrlEditor 等。其他与特定 Web 控件相关的编辑器类存在于System.Web.UI.Design.WebControls
命名空间中,如 DataGridColumnCollectionEditor、ListItemsCollectionEditor 等。要为您的属性创建新的自定义编辑器类,您必须派生自基类
UITypeEditor
。此基类存在于System.Drawing.Design
命名空间中。