这是一个完整的自定义控件,事件相应,自定义属性等都有涉及。为了方便,直接从Panel继承。
这是我写的第一个控件(其实我尝试学习和使用ASP.net也只不过三周),如果有什么批评和建议,欢迎联系!
using
System;
using System.Data;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing.Design;
namespace CustomObject
... {
/**//// <summary>
/// 一个Panel的扩展控件,支持最大化和最小化的缩放。
///
/// ------------------
/// 2007/8/30
/// 李兰非
/// Beat 1
/// Thesmallcar@Gmail.com
/// ------------------
///
/// 目前完成了主要的功能,对属性窗口进行了最基本的控制,例如对图片选择的属性,增加了路径选择窗口。
///
/// </summary>
///
[DefaultProperty("Title")]
[ToolboxData("<{0}:MinimizePanel runat=server></{0}:MinimizePanel>")]
public class MinimizePanel : Panel, INamingContainer
...{
public MinimizePanel()
...{
IsMinimum = false;
Title = "标题";
Height = 100;
Width = 100;
}
--public 属性 : 标题#region --public 属性 : 标题
private Label TitleLabel = new Label();
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("标题")]
[Description("标题。")]
public String Title
...{
get
...{
String s = this.TitleLabel.Text;
return s;
}
set
...{
TitleLabel.Text = value;
}
}
#endregion
--public 属性 : 最小化标志#region --public 属性 : 最小化标志
[Bindable(false)]
[Category("Behavior")]
[Description("是否为最大化。")]
[DefaultValue(false)]
public bool IsMinimum
...{
get
...{
bool b = (bool)ViewState["IsMinimum"];
return b;
}
set
...{
ViewState["IsMinimum"] = value;
}
}
#endregion
--public 属性 : 宽度#region --public 属性 : 宽度
[Bindable(false)]
[Category("Layout")]
[Description("宽度。")]
[DefaultValue(100)]
public override Unit Width
...{
get
...{
Unit w = (Unit)ViewState["Width"];
return w;
}
set
...{
ViewState["Width"] = value;
}
}
#endregion
--public 属性 : 高度#region --public 属性 : 高度
[Bindable(false)]
[Category("Layout")]
[Description("高度。")]
[DefaultValue(100)]
public override Unit Height
...{
get
...{
Unit h = (Unit)ViewState["Height"];
return h;
}
set
...{
ViewState["Height"] = value;
}
}
#endregion
--public 属性 : TopLeft图片#region --public 属性 : TopLeft图片
private Image TopLeft = new Image();
[Bindable(false)]
[Category("Appearance")]
[Description("Top Left图片。")]
[DefaultValue("")]
[UrlProperty]
[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public String TopLeftImage
...{
get
...{
return TopLeft.ImageUrl;
}
set
...{
TopLeft.ImageUrl = value;
}
}
#endregion
--public 属性 : TopMiddle图片#region --public 属性 : TopMiddle图片
[Bindable(false)]
[Category("Appearance")]
[Description("Top Middle图片。")]
[DefaultValue("")]
[UrlProperty]
[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public String TopMiddleImage
...{
get
...{
String tm = (String)ViewState["TopMiddleImage"];
return tm;
}
set
...{
ViewState["TopMiddleImage"] = value;
}
}
#endregion
--public 属性 : TopRight图像#region --public 属性 : TopRight图像
private ImageButton MinimizeButton = new ImageButton();
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Description("Top Right图片。")]
[UrlProperty]
[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public String TopRightImage
...{
get
...{
return MinimizeButton.ImageUrl;
}
set
...{
MinimizeButton.ImageUrl = value;
}
}
#endregion
--public 属性 : bottom图片#region --public 属性 : bottom图片
[Bindable(false)]
[Category("Appearance")]
[Description("Bottom图片。")]
[DefaultValue("")]
[UrlProperty]
[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public String BottomImage
...{
get
...{
String bi = (String)ViewState["BottomImage"];
return bi;
}
set
...{
ViewState["BottomImage"] = value;
}
}
#endregion
--protected 过程 : 界面呈现#region --protected 过程 : 界面呈现
protected override void Render(HtmlTextWriter output)
...{
RenderHead(output);
if (false == IsMinimum)
...{
base.Render(output);
}
RenderEnd(output);
}
protected void RenderHead(HtmlTextWriter writer)
...{
writer.Write("<table border="0" cellpadding="0" cellspacing="0" width="" + Width.ToString() + "" height="" + Height.ToString() + "" > ");
writer.Write("<tr><td> ");
writer.Write("<table border="0" cellpadding="0" cellspacing="0" width="100%"> ");
writer.Write("<tr> ");
writer.Write("<td>");
TopLeft.RenderControl(writer);
writer.Write("</td> ");
writer.Write("<td background="" + TopMiddleImage + "" class="SmallWhite" width="100%">");
TitleLabel.RenderControl(writer);
writer.Write("</td> ");
writer.Write("<td width="31">");
MinimizeButton.RenderControl(writer);
writer.Write("</td> ");
writer.Write("</tr> ");
writer.Write("</table> ");
writer.Write("</td></tr> ");
if (false == IsMinimum)
writer.Write("<tr><td> ");
//防止MinimizeButton在base.Render(output)中被重复输出。
MinimizeButton.Visible = false;
}
protected void RenderEnd(HtmlTextWriter writer)
...{
if (false == IsMinimum)
writer.Write("</td></tr> ");
writer.Write("<tr><td>");
writer.Write("<img src="" + BottomImage + "" width="180" />");
writer.Write("</td></tr> ");
writer.Write("</table> ");
}
#endregion
protected override void CreateChildControls()
...{
MinimizeButton.Click += new ImageClickEventHandler(Minimize);
this.Controls.Add(MinimizeButton);
}
--protected 事件 : 最小化/最大化切换事件#region --protected 事件 : 最小化/最大化切换事件
/**//// <summary>
/// 最小化/最大化切换事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Minimize(object sender, ImageClickEventArgs e)
...{
IsMinimum = !IsMinimum;
}
#endregion
}
}
using System.Data;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing.Design;
namespace CustomObject
... {
/**//// <summary>
/// 一个Panel的扩展控件,支持最大化和最小化的缩放。
///
/// ------------------
/// 2007/8/30
/// 李兰非
/// Beat 1
/// Thesmallcar@Gmail.com
/// ------------------
///
/// 目前完成了主要的功能,对属性窗口进行了最基本的控制,例如对图片选择的属性,增加了路径选择窗口。
///
/// </summary>
///
[DefaultProperty("Title")]
[ToolboxData("<{0}:MinimizePanel runat=server></{0}:MinimizePanel>")]
public class MinimizePanel : Panel, INamingContainer
...{
public MinimizePanel()
...{
IsMinimum = false;
Title = "标题";
Height = 100;
Width = 100;
}
--public 属性 : 标题#region --public 属性 : 标题
private Label TitleLabel = new Label();
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("标题")]
[Description("标题。")]
public String Title
...{
get
...{
String s = this.TitleLabel.Text;
return s;
}
set
...{
TitleLabel.Text = value;
}
}
#endregion
--public 属性 : 最小化标志#region --public 属性 : 最小化标志
[Bindable(false)]
[Category("Behavior")]
[Description("是否为最大化。")]
[DefaultValue(false)]
public bool IsMinimum
...{
get
...{
bool b = (bool)ViewState["IsMinimum"];
return b;
}
set
...{
ViewState["IsMinimum"] = value;
}
}
#endregion
--public 属性 : 宽度#region --public 属性 : 宽度
[Bindable(false)]
[Category("Layout")]
[Description("宽度。")]
[DefaultValue(100)]
public override Unit Width
...{
get
...{
Unit w = (Unit)ViewState["Width"];
return w;
}
set
...{
ViewState["Width"] = value;
}
}
#endregion
--public 属性 : 高度#region --public 属性 : 高度
[Bindable(false)]
[Category("Layout")]
[Description("高度。")]
[DefaultValue(100)]
public override Unit Height
...{
get
...{
Unit h = (Unit)ViewState["Height"];
return h;
}
set
...{
ViewState["Height"] = value;
}
}
#endregion
--public 属性 : TopLeft图片#region --public 属性 : TopLeft图片
private Image TopLeft = new Image();
[Bindable(false)]
[Category("Appearance")]
[Description("Top Left图片。")]
[DefaultValue("")]
[UrlProperty]
[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public String TopLeftImage
...{
get
...{
return TopLeft.ImageUrl;
}
set
...{
TopLeft.ImageUrl = value;
}
}
#endregion
--public 属性 : TopMiddle图片#region --public 属性 : TopMiddle图片
[Bindable(false)]
[Category("Appearance")]
[Description("Top Middle图片。")]
[DefaultValue("")]
[UrlProperty]
[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public String TopMiddleImage
...{
get
...{
String tm = (String)ViewState["TopMiddleImage"];
return tm;
}
set
...{
ViewState["TopMiddleImage"] = value;
}
}
#endregion
--public 属性 : TopRight图像#region --public 属性 : TopRight图像
private ImageButton MinimizeButton = new ImageButton();
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Description("Top Right图片。")]
[UrlProperty]
[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public String TopRightImage
...{
get
...{
return MinimizeButton.ImageUrl;
}
set
...{
MinimizeButton.ImageUrl = value;
}
}
#endregion
--public 属性 : bottom图片#region --public 属性 : bottom图片
[Bindable(false)]
[Category("Appearance")]
[Description("Bottom图片。")]
[DefaultValue("")]
[UrlProperty]
[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public String BottomImage
...{
get
...{
String bi = (String)ViewState["BottomImage"];
return bi;
}
set
...{
ViewState["BottomImage"] = value;
}
}
#endregion
--protected 过程 : 界面呈现#region --protected 过程 : 界面呈现
protected override void Render(HtmlTextWriter output)
...{
RenderHead(output);
if (false == IsMinimum)
...{
base.Render(output);
}
RenderEnd(output);
}
protected void RenderHead(HtmlTextWriter writer)
...{
writer.Write("<table border="0" cellpadding="0" cellspacing="0" width="" + Width.ToString() + "" height="" + Height.ToString() + "" > ");
writer.Write("<tr><td> ");
writer.Write("<table border="0" cellpadding="0" cellspacing="0" width="100%"> ");
writer.Write("<tr> ");
writer.Write("<td>");
TopLeft.RenderControl(writer);
writer.Write("</td> ");
writer.Write("<td background="" + TopMiddleImage + "" class="SmallWhite" width="100%">");
TitleLabel.RenderControl(writer);
writer.Write("</td> ");
writer.Write("<td width="31">");
MinimizeButton.RenderControl(writer);
writer.Write("</td> ");
writer.Write("</tr> ");
writer.Write("</table> ");
writer.Write("</td></tr> ");
if (false == IsMinimum)
writer.Write("<tr><td> ");
//防止MinimizeButton在base.Render(output)中被重复输出。
MinimizeButton.Visible = false;
}
protected void RenderEnd(HtmlTextWriter writer)
...{
if (false == IsMinimum)
writer.Write("</td></tr> ");
writer.Write("<tr><td>");
writer.Write("<img src="" + BottomImage + "" width="180" />");
writer.Write("</td></tr> ");
writer.Write("</table> ");
}
#endregion
protected override void CreateChildControls()
...{
MinimizeButton.Click += new ImageClickEventHandler(Minimize);
this.Controls.Add(MinimizeButton);
}
--protected 事件 : 最小化/最大化切换事件#region --protected 事件 : 最小化/最大化切换事件
/**//// <summary>
/// 最小化/最大化切换事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Minimize(object sender, ImageClickEventArgs e)
...{
IsMinimum = !IsMinimum;
}
#endregion
}
}
使用示例:
例子里的图片自然是显示不出来的。替换成自己相应的图片就可用了。
图片的分布是标题栏三个(左中右),内容区一个(背景),底部一个。
标题栏的三个图片,左和右的两个会影响控件的宽度(以img 来显示的)。底部的那个图片也是。
<%
...
@ Page Language="C#" AutoEventWireup="true" CodeFile="Test2.aspx.cs" Inherits="Test2"
%>
<!-- 注册控件 -->
<% ... @ Register Namespace="CustomObject" TagPrefix="custom" %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head runat ="server" >
< title > 无标题页 </ title >
< link href ="Style.css" rel ="stylesheet" type ="text/css" />
</ head >
< body >
< form id ="form1" runat ="server" >
< br />
< br />
< div style ="text-align: center" >
<!-- 使用控件 -->
< custom:MinimizePanel runat ="Server" ID ="Test1" Title ="测试" BackImageUrl ="~/Img/LeftBarBG/LeftBarBG_02.gif"
CssClass ="Small" Height ="" TopLeftImage ="Img/LeftBarBG/LeftBarBG_01_01.gif" Width ="180px"
TopMiddleImage ="Img/LeftBarBG/LeftBarBG_01_02.gif" TopRightImage ="Img/LeftBarBG/LeftBarBG_01_03.gif"
BottomImage ="Img/LeftBarBG/LeftBarBG_03.gif" >
测试
< br />
< br />
测试
</ custom:MinimizePanel >
<!-- 控件结束 -->
</ div >
</ form >
</ body >
</ html >
<!-- 注册控件 -->
<% ... @ Register Namespace="CustomObject" TagPrefix="custom" %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head runat ="server" >
< title > 无标题页 </ title >
< link href ="Style.css" rel ="stylesheet" type ="text/css" />
</ head >
< body >
< form id ="form1" runat ="server" >
< br />
< br />
< div style ="text-align: center" >
<!-- 使用控件 -->
< custom:MinimizePanel runat ="Server" ID ="Test1" Title ="测试" BackImageUrl ="~/Img/LeftBarBG/LeftBarBG_02.gif"
CssClass ="Small" Height ="" TopLeftImage ="Img/LeftBarBG/LeftBarBG_01_01.gif" Width ="180px"
TopMiddleImage ="Img/LeftBarBG/LeftBarBG_01_02.gif" TopRightImage ="Img/LeftBarBG/LeftBarBG_01_03.gif"
BottomImage ="Img/LeftBarBG/LeftBarBG_03.gif" >
测试
< br />
< br />
测试
</ custom:MinimizePanel >
<!-- 控件结束 -->
</ div >
</ form >
</ body >
</ html >
控件图示: