第五章 开发一个简单的自定义控件
服务器控件基类的层次:
Control类为参与到网页框架中提供了基本的功能。可以将服务器控件加入到代表.aspx页面的控件树种,还实现了System.ComponentModel.IComponent接口,使它成为可设计的组件。
WebControl类为表现HTML内容而在Control基类中新增了一些功能,通过属性提供了对样式的支持等等。
System.Web.UI.HtmlTextWriter是一个工具类,它封装了将HTML写成文本流的功能函数。
不要从控件中直接调用Page.Response.Write,这样会打破页面框架的封装性,为了写入响应流,可重载Control或WebControl类的一个生成方法。(P82)
从WebControl中派生(P87)
1)不要通过重载Render方法来直接向输出流中写数据,这是因为WebControl的Render方法实现了一段程序,这段程序向外部提供带有样式信息的标签,如果想在控件的标签内提供内容,可以用重载RenderContents方法来实现。
2)如果要提供一个不同于<span>的标签,必须重载从WebControl类继承来的TagKey属性或TagName属性(对于非标准HTML标签来说),WebControl类默认的设置是生成一个HTML<span>标签。
为控件选择基类的标准(P89)
1)如果控件要生成非可视化的元素或显示给非HTML客户端,应该从System.Web.UI.Control类派生。
2)如果想提供一些在客户端生成可视化界面的HTML,应该从System.Web.UI.WebControl类派生。
3)当想扩展或修改控件的功能时,应该从一个已存在的控件派生,可以从任何一个System.Web.UI.WebControl命名空间中的控件派生。但是不要从System.Web.UI.HtmlControl命名空间中的控件派生。 Visual Studio .NET设计器不承认直接或间接派生于HtmlControl的控件,因为这些控件会破坏HTML控件模式,在声明性页面语法中,HTML控件的出现是没有标签前缀的(如<Button runat="server" />)。但是,当在页面中声明式地使用时,所有的自定义控件(包括那些从HtmlControl或其子类中派生的控件)都需要有一个标签前缀。
为了得到控件的设计期特征,必须提供元数据,使用attribute来为控件提供设计期特征,用其来改善设计期方式。(P90)
应用TagPrefixAttribute(P91)
TagPrefixAttribute是一个配件层的attribute,它提供一个标签前缀,当一个控件从工具箱中拖曳到设计界面时,设计器就会为控件使用这个标签前缀。
因为TagPrefixAttribute是一个配件层的attribute,所以它并不直接应用于任何特定的控件,而是在一个单独的文件(AssemblyInfo.cs)中声明,并且作为控件编译进同一个配件。
示例:[assembly:TagPrefix("MSPress.ServerControls", "msp")]
自定义工具箱图标(P93)
可以在控件的配件中嵌入一个位图文件来为控件提供不同的图标,必须是一个16×16的位图,必须在与所关联的控件的命名空间中作为托管资源而被嵌入。
这个位图的名称必须与它所关联的控件类相一致,按照惯例,位图的左下象素决定它的透明色。
示例:见MSPress.WebControls下的DatePicker控件和ListView控件。
一般情况下,控件的视觉外观在设计阶段和运行期是一样的,如果想让控件在设计阶段显示的不一样,可以将控件和与该控件对应的称为设计器(designer)的一些特殊的类关联起来。(第15章)
Control类为参与到网页框架中提供了基本的功能。可以将服务器控件加入到代表.aspx页面的控件树种,还实现了System.ComponentModel.IComponent接口,使它成为可设计的组件。
WebControl类为表现HTML内容而在Control基类中新增了一些功能,通过属性提供了对样式的支持等等。
System.Web.UI.HtmlTextWriter是一个工具类,它封装了将HTML写成文本流的功能函数。
不要从控件中直接调用Page.Response.Write,这样会打破页面框架的封装性,为了写入响应流,可重载Control或WebControl类的一个生成方法。(P82)
从WebControl中派生(P87)
1)不要通过重载Render方法来直接向输出流中写数据,这是因为WebControl的Render方法实现了一段程序,这段程序向外部提供带有样式信息的标签,如果想在控件的标签内提供内容,可以用重载RenderContents方法来实现。
2)如果要提供一个不同于<span>的标签,必须重载从WebControl类继承来的TagKey属性或TagName属性(对于非标准HTML标签来说),WebControl类默认的设置是生成一个HTML<span>标签。
为控件选择基类的标准(P89)
1)如果控件要生成非可视化的元素或显示给非HTML客户端,应该从System.Web.UI.Control类派生。
2)如果想提供一些在客户端生成可视化界面的HTML,应该从System.Web.UI.WebControl类派生。
3)当想扩展或修改控件的功能时,应该从一个已存在的控件派生,可以从任何一个System.Web.UI.WebControl命名空间中的控件派生。但是不要从System.Web.UI.HtmlControl命名空间中的控件派生。 Visual Studio .NET设计器不承认直接或间接派生于HtmlControl的控件,因为这些控件会破坏HTML控件模式,在声明性页面语法中,HTML控件的出现是没有标签前缀的(如<Button runat="server" />)。但是,当在页面中声明式地使用时,所有的自定义控件(包括那些从HtmlControl或其子类中派生的控件)都需要有一个标签前缀。
为了得到控件的设计期特征,必须提供元数据,使用attribute来为控件提供设计期特征,用其来改善设计期方式。(P90)
应用TagPrefixAttribute(P91)
TagPrefixAttribute是一个配件层的attribute,它提供一个标签前缀,当一个控件从工具箱中拖曳到设计界面时,设计器就会为控件使用这个标签前缀。
因为TagPrefixAttribute是一个配件层的attribute,所以它并不直接应用于任何特定的控件,而是在一个单独的文件(AssemblyInfo.cs)中声明,并且作为控件编译进同一个配件。
示例:[assembly:TagPrefix("MSPress.ServerControls", "msp")]
自定义工具箱图标(P93)
可以在控件的配件中嵌入一个位图文件来为控件提供不同的图标,必须是一个16×16的位图,必须在与所关联的控件的命名空间中作为托管资源而被嵌入。
这个位图的名称必须与它所关联的控件类相一致,按照惯例,位图的左下象素决定它的透明色。
示例:见MSPress.WebControls下的DatePicker控件和ListView控件。
一般情况下,控件的视觉外观在设计阶段和运行期是一样的,如果想让控件在设计阶段显示的不一样,可以将控件和与该控件对应的称为设计器(designer)的一些特殊的类关联起来。(第15章)
posted on 2006-01-05 10:14 ............. 阅读(152) 评论(0) 收藏 举报
浙公网安备 33010602011771号