为 ASP.NET 控件添加设计时支持(二)

翻译|其它|编辑:郝浩|2005-03-02 13:14:00.000|阅读 1146 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


设计视图和元数据特性

Visual Studio .NET 为使用拖放技术的动态控件设计和修改提供了丰富的支持,同时还提供了属性浏览器之类的工具以及相关的设计器(例如颜色选择器)。对这些工具的支持是通过一系列特性提供的,您可以将这些特性添加到您的控件中。这些特性用于告诉 Visual Studio IDE 是否在属性浏览器中显示控件的属性、属性所属的类型以及应使用哪个设计器设置属性的值。

对于将要提供设计时支持的控件版本,我们将制作一份控件文件 Blog.vb 的副本,并将其命名为 Blog_DT.vb,然后在副本文件上进行修改。这样可以生成该控件的设计时版本,并保留原始控件以便进行比较。

要支持在属性浏览器中编辑 AddRedirect 属性,应在属性进程之前添加以下特性,如以下代码片段所示:

<Browsable(True), _设计视图和元数据特性
Visual Studio .NET 为使用拖放技术的动态控件设计和修改提供了丰富的支持,同时还提供了属性浏览器之类的工具以及相关的设计器(例如颜色选择器)。对这些工具的支持是通过一系列特性提供的,您可以将这些特性添加到您的控件中。这些特性用于告诉 Visual Studio IDE 是否在属性浏览器中显示控件的属性、属性所属的类型以及应使用哪个设计器设置属性的值。

对于将要提供设计时支持的控件版本,我们将制作一份控件文件 Blog.vb 的副本,并将其命名为 Blog_DT.vb,然后在副本文件上进行修改。这样可以生成该控件的设计时版本,并保留原始控件以便进行比较。

要支持在属性浏览器中编辑 AddRedirect 属性,应在属性进程之前添加以下特性,如以下代码片段所示:

<Browsable(True), _
Category("行为"), _
Description("成功提交新的 Blog 条目后, " & _
"应重定向到的 " & _
"页面的 URL。"), _
Editor("System.Web.UI.Design.UrlEditor", _
GetType(UITypeEditor))> _
Public Property AddRedirect() As String
'属性进程代码
End Property

这些特性声明允许在属性浏览器中显示属性、为属性设置所需的类别(当属性按类别排序时)、提供属性说明并告诉 Visual Studio .NET 使用 UrlEditor 类编辑属性的值,如图 4 所示。



图 4:设计视图中的属性支持

此处所述的特性语法适用于 Visual Basic .NET。在 Visual Basic .NET 中,特性通过以下语法进行声明:

<AttributeName(AttributeParams)>

在 C# 中,特性采用如下形式:

[AttributeName(AttributeParams)]

Visual Basic .NET 要求特性声明与其修改的成员位于同一行中,因此通常最好在特性后面跟一个 Visual Basic 行接续字符以提高可读性:

<AttributeName(AttributeParams)> _
Public Membername()

在 C# 和 Visual Basic 中,您可以在一对 [ ] 或 <> 括号中声明多个特性,特性之间用逗号分隔。而在 Visual Basic .NET 中,如果它们出现在不同的行中,则必须使用 Visual Basic 行接续符衔接特性,使其位于同一个语句中。

添加工具箱支持

除了设置属性级别的特性外,还可设置某些类和程序集级别的特性。例如,您可以使用程序集级别的特性 TagPrefix 来指定标记前缀,供程序集中包含的任何控件使用。之后,当您从 Visual Studio 工具箱中向某个 Web 窗体页上添加该控件的实例时,Visual Studio .NET 将自动插入这个标记前缀。以下代码片段显示了 TagPrefix 特性的语法。该特性应放置在定义该控件的类模块内,但应在类和命名空间声明之外(请注意,在 Visual Basic .NET 项目中,命名空间是在项目级别定义的,因此您不用担心如何将程序集特性放置到命名空间声明之外)。在以下特性中,TagPrefix 特性的第一个参数是控件的命名空间,第二个参数是您希望为标记前缀使用的文本。

<Assembly: TagPrefix("BlogControl", "BlogControl")>

要将控件集成到 Visual Studio .NET 环境中,应将 ToolBoxData 特性(该特性用于告诉 Visual Studio .NET 从工具箱中为控件插入的首选标记名)添加到实现该控件的类中:

<ToolboxData("<{0}:Blog_DT runat=server></{0}:Blog_DT>")> _
Public Class Blog_DT
Inherits Panel
Implements INamingContainer
'控件实现
End Class

将控件从工具箱中插入到页面上时,由 TagPrefix 特性指定的标记前缀将插入 {0} 占位符,而其他文本将按原样插入。

您还可以为控件提供自己的自定义图标,以显示在工具箱中。为此,需要创建一个 16 x 16 像素大小的位图(左下方的像素采用透明色),其名称与包含该控件的类相同(即 classname.bmp)。使用 Add Existing Item(添加现有项)命令将该位图添加到项目中,然后使用属性浏览器将其 Build Action(创建操作)设置为 Embedded Resource(内置资源),如图 5 所示。



图 5:设置 Build Action(创建操作)

编译完成后,该控件将支持从工具箱中将控件添加到某个页面中时为 Blog 控件自动插入 @Register 指令、标记前缀和标记名,并在工具箱中显示自定义图标,如图 6 所示。要将控件添加到 Visual Studio .NET 工具箱中,应完成以下简单步骤:

在设计视图中,选择 Visual Studio .NET 工具箱的 Web forms(Web 窗体)选项卡。
在该选项卡上的任意位置单击鼠标右键,然后选择 Add/Remove Items(添加项目/删除项目)(Visual Studio .NET 2002 中为 Customize Toolbox [自定义工具箱])。
选择 .NET Framework Components(.NET Framework 组件)选项卡,然后单击 Browse(浏览)。
浏览到编译后的控件程序集所在的位置,选中它并单击 Open(打开)。
单击 OK(确定)。


图 6:工具箱中的自定义控件

将控件添加到工具箱中后,可以通过双击该控件或将其从工具箱中拖放到 Web 窗体页上,将其添加到 Web 窗体页中。无论何种情况,Visual Studio .NET 都会自动插入正确的 @Register 指令(包括基于程序集级别的特性设置 TagPrefix),还将使用 ToolBoxData 属性中指定的标记名为该控件生成一组标记。

添加设计器

正如前文所述,Blog 控件在 Web 窗体编辑器的设计视图中没有任何可视界面。这使得选择页面上的控件很困难,更难以理解控件在运行时的外观。为了解决这个问题,我们可以添加设计器支持,使设计时的 HTML 在外观上接近于运行时的 Blog 控件。请注意,您还可以生成可以完整再现控件运行时输出的设计器,但此操作相当复杂,而且超出了本文的讨论范围。

所有服务器控件设计器都是从类 System.Web.UI.Design.ControlDesigner 派生而来,该类提供了大量方法,您可以重写这些方法为您的控件提供设计时渲染。以下代码简单重写了 GetDesignTimeHtml 方法,返回设计时显示的简单 HTML。请注意,该示例显示了 Blog 控件的整个设计器类,您可以简单地将其添加到现有的 Blog_DT.vb 类文件中。

Public Class BlogDesigner
Inherits ControlDesigner

Public Overrides Function GetDesignTimeHtml() As String
Return "<h1>Blog</h1><hr/><hr/>"
End Function

End Class

要将该设计器绑定到 Blog_DT 类中,我们使用了 Designer 特性,如以下片段所示。请注意,此段代码还添加了一个描述控件功能的 Description 特性。

<Description("简单 Blog 控件。支持显示 " & _
"Web 日志/来自 XML 文件的新条目。"), _
Designer("BlogControl.BlogDesigner"), _
ToolboxData("<{0}:Blog_DT runat=server></{0}:Blog_DT>")> _
Public Class Blog_DT
Inherits Panel
Implements INamingContainer

如您所见,BlogDesigner 类非常简单,但它为控件在 Web 窗体页上的设计时外观添加了大量内容,如图 7 所示。



图 7:添加设计时渲染

列表 4 显示了 Blog 控件的代码,它已经使用特性进行了更新,以启用设计视图和属性浏览器中的控件设计时支持。请注意,该示例添加了多条 using 指令,以导入支持我们使用的特性和设计器类所需要的命名空间。这个新列表还添加了一个用于 Mode 属性值的枚举。
 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP