詳解ASP.NET自定義樣式屬性
位于WebControls命名空間的style類為頂級樣式類.大部分標準控件都擁有其樣式屬性.
1.下面為設置樣式方法
(1)你可以直接設置控件樣式
- Button1.BackColor = System.Drawing.Color.Red;
(2)通過獲取web控件的樣式集合來設置
- Button1.ControlStyle.BackColor = System.Drawing.Color.Red;
(3)通過設置樣式類,利用WebControl類的ApplyStyle方法來復制非空樣式,并改寫現(xiàn)有樣式
- myStyle.BackColor = System.Drawing.Color.Red;
- Button1.ApplyStyle(myStyle);
(4)一直定義樣式表屬性,不使用控件屬性,與定義HTML樣式相同.
- style="background-color: red"
下面引出話題,為什么要使用樣式?大家知道定義樣式可以使用統(tǒng)一風格,定義好的樣式,可以重復使用.再回來看上面設置樣式方法.
2.了解WebControl.BackColor和Style.BackColor
(1)和(2)是差不多的.但(3)則不同,(3)的定義方法有通用性,你可以定義一種樣式,然后利用控件的ApplyStyle方法來引用樣式.給樣式編程提供了方面
WebControl類定義了通用的樣式.(1)和(2)使用的樣式屬性與(3)不同
3.ASP.NET自定義樣式屬性
剛開始就講了style類為通用的頂級樣式類,但需求是會發(fā)生變化的. 好了,下面真正開始編碼了.
下面以改寫label控件為例子
(1)改寫樣式屬性,讓其默認背景為紅色,相信大家一定看的懂
- namespaceCustomComponents
- {
- [ToolboxData(@"<{0}:ImageLabel1
- BackColor='Red'
- runat='server'></{0}:ImageLabel1>")
- ]
- publicclassImageLabel1:Label
- {
- publicoverridestringText
- {
- get{returnViewState["Text"]!=null?(string)ViewState["Text"]:base.ID;}
- set{ViewState["Text"]=value;}
- }
- publicoverrideSystem.Drawing.ColorBackColor
- {
- get
- {
- returnbase.BackColor=System.Drawing.Color.Red;
- }
- set
- {
- base.BackColor=value;
- }
- }
- }
- }
(2)為label新增一個背景圖片的屬性,重寫了一下AddAttributesToRender方法,添加一個樣式屬性,AddAttributesToRender方法以前為大家講過,這里不多講了.
- namespaceCustomComponents
- {
- publicclassImageLabel2:Label
- {
- [BrowsableAttribute(true)]
- [DescriptionAttribute("背景")]
- [CategoryAttribute("Appearance")]
- publicvirtualStringImageUrl
- {
- get{returnViewState["imageUrl"]!=null?(string)ViewState["imageUrl"]:"";}
- set{ViewState["imageUrl"]=value;}
- }
- overrideprotectedvoidAddAttributesToRender(HtmlTextWriterwriter)
- {
- writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundImage,ImageUrl);
- base.AddAttributesToRender(writer);
- }
- }
- }
(3)上面示例二中我們定義了背景樣式,其實.net已經(jīng)為我們把工作做好了,從style類派生了很多樣式類,擴展了style類的屬性,滿足不同控件樣式的需求.
(4)使用派生樣式類,定義控件樣式屬性.示例四中說過了,沒有定義控件樣式屬性,只改寫了CreateControlStyle方法.那就意味了你定義的控件樣式屬性可以直接使用TableStyle類中的屬性,但默認情況下的樣式屬性為style類中屬性,所以需要強行轉(zhuǎn)換.
4.自定義類型化樣式屬性
如果樣式屬性無法滿足你需求,則你可以通過自定義類型化樣式來實現(xiàn).
什么是自定義類型化樣式?就是該類從style類派生,對其進行修改和擴充(書上就這么寫了...我就這么理解了-_-)
如Table控件,一方面控件ASP.NET自定義樣式屬性,另一方面又定義了TableStyle類.你可以在使用控件樣式屬性和TableStyle類中進行選擇.
但TableStyle類具有通用性,具有一定的靈活性.好了下面我們又要開始看代碼了.當然從簡單開始
(1)簡單呈現(xiàn)樣式屬性
需要說明的注意點如下
1.重寫LabelStyle(StateBag viewState)構造函數(shù)
2.樣式屬性需用視圖狀態(tài)來聲明
3.Style類的重載的AddAttributesToRender方法需用兩個參數(shù)的方法
AddAttributesToRender(HtmlTextWriter writer, WebControl owner)
2)使用編程
下面我們以編程方式,給控件添加ASP.NET自定義樣式屬性。發(fā)現(xiàn)BackColor屬性能夠呈現(xiàn)但ImageUrl 無法呈現(xiàn),那說明我們剛才自定義的類就失去意義了,也說明我們還未重寫某個方法.
- protectedvoidPage_Load(objectsender,EventArgse)
- {
- //默認label控件
- TableStylea=newTableStyle();
- a.BackImageUrl="images4.bmp";
- a.BackColor=System.Drawing.Color.Red;
- Label1.ApplyStyle(a);
- //自定義控件
- ImageLabel3_1.ApplyStyle(a);
- }
【編輯推薦】