这是一个完整的自定义控件,事件相应,自定义属性等都有涉及。为了方便,直接从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
}
}
使用示例:
例子里的图片自然是显示不出来的。替换成自己相应的图片就可用了。
图片的分布是标题栏三个(左中右),内容区一个(背景),底部一个。
标题栏的三个图片,左和右的两个会影响控件的宽度(以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
>
控件图示:
