/*
本章讨论ASP.NET控件的设计时功能。
*/
你不会想永远只做自己玩玩的控件吧?
最终你希望自己的控件成为一个真正的产品,或获得商业回报,或免费服务大众。当你的控件呈现在别人面前时,它应该是精工细作的,精工细作不仅表现在功能强大上,而且表现在界面美观、操作直观上。
简而言之,就是要让用户在使用你的控件是一个愉悦的旅程。此时,控件的设计时功能就显得极为重要了。
什么是设计时功能?我们通常说Visual Studio是一个“所见即所得”的IDE工具,设计时功能就是“所见”的部分,也就是说编辑器和页面设计者交互的功能。
6.1 设计时功能综述
.NET提供了丰富的设计时接口,这些接口可以被Visual Studio等IDE工具利用,提供丰富的设计时功能,这些设计时功能有的通用于Winforms开发和ASP.NET开发,有的专用于ASP.NET开发。特定到ASP.NET来讲,它的运行时支持机制主要包括:设计器(Designer)、类型转换器(TypeConverter)、UI类型编辑器(UITypeEditor),如图6-1所示。

图6-1 ASP.NET运行时构架
图6-1展示了设计时支持机制与设计时环境的交互关系,窗体(Form)设计器主要和设计器交互,属性窗口和三种机制都有交互。
而定制控件的设计时行为,则需要通过Attribute来关联,设计时Attribute有很多,其中不少我们已经使用过了,常见的设计时Attribute如表6-1所列。
表6-1 常见的设计时Attribute
|
Attribute |
应用于 |
说 明 |
|
BrowsableAttribute |
属性事件 |
指定属性或事件是否应该显示在属性浏览器中 |
|
CategoryAttribute |
属性事件 |
指定类别的名称,对属性或事件进行分组。当使用了类别时,组件属性和事件可以按分组显示在属性浏览器中 |
|
Description Attribute |
属性事件 |
定义描述文本,该文本将在用户选择属性或事件时显示在属性浏览器底部 |
|
BindableAttribute |
属性 |
指定是否要绑定到该属性 |
|
DefaultProperty Attribute |
类 |
指定控件的默认属性。当用户单击控件时,将在属性浏览器中选定该属性 |
|
DefaultValue Attribute |
属性 |
为属性设置一个简单的默认值 |
|
EditorAttribute |
属性 |
指定在可视设计器中编辑(更改)属性时要使用的编辑器 |
续表
|
Attribute |
应用于 |
说 明 |
|
Localizable Attribute |
属性 |
指定属性可本地化。当用户要本地化某个窗体时,任何具有该Attribute的属性都将自动永久驻留到资源文件中 |
|
Designer Serialization Visibility Attribute |
属性 |
指定显示在属性浏览器中的属性是否应该(以及如何)序列化在页面源代码中 |
|
TypeConverter Attribute |
属性 |
指定将属性的类型转换为另一个数据类型时要使用的类型转换器 |
|
DefaultEvent Attribute |
类 |
指定控件的默认事件。这是当用户单击组件时在属性浏览器中选定的事件 |
|
DesignerAttribute |
类 |
指定控件的设计器 |
|
DesignerOnly Attribute |
属性 |
指定只能在设计时设置属性 |
|
ReadOnlyAttribute |
属性 |
指定属性在设计时只读 |
|
Parenthesize PropertyName Attribute |
属性 |
属性名显示在控号中 |
|
NotifyParent PropertyAttribute |
属性 |
用于嵌套属性改变时通知其父级属性 |
|
RefreshProperties Attribute |
属性 |
指定刷不刷新控件属性或刷新设计器视图 |
不要畏惧这些Attribute的数量,正是有这么多Attribute可用于设计时,设计时功能才会这么丰富。而且我们最常用的Attribute是表6-1中加粗体标记的,对于这些Attribute,我们在之前或之后都会有详细说明和具体应用实例。
本章,我们将重点对DesignerAttribute、EditorAttibute、TypeConverterAttribute这三个相对复杂的功能展开讨论。







