自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ASP.NET控件開發(fā)基礎(chǔ)之自定義控件樣式屬性淺析

開發(fā) 后端
ASP.NET控件開發(fā)基礎(chǔ)之自定義控件樣式屬性主要向你講述自定義控件樣式屬性的基本情況,希望你對(duì)自定義控件樣式屬性有所了解。

ASP.NET控件開發(fā)基礎(chǔ)之自定義控件樣式屬性是怎么樣的呢?首先讓我們來看看,位于WebControls命名空間的style類為頂級(jí)樣式類.大部分標(biāo)準(zhǔn)控件都擁有其樣式屬性.

ASP.NET控件開發(fā)基礎(chǔ)之自定義控件樣式屬性1.下面為設(shè)置樣式方法

(1)你可以直接設(shè)置控件樣式

Button1.BackColor = System.Drawing.Color.Red;

(2)通過獲取web控件的樣式集合來設(shè)置

Button1.ControlStyle.BackColor = System.Drawing.Color.Red;

(3)通過設(shè)置樣式類,利用WebControl類的ApplyStyle方法來復(fù)制非空樣式,并改寫現(xiàn)有樣式

  1. myStyle.BackColor = System.Drawing.Color.Red;  
  2.  
  3. Button1.ApplyStyle(myStyle); 

(4)一直定義樣式表屬性,不使用控件屬性,與定義HTML樣式相同.

 style="background-color: red"

下面引出話題,為什么要使用樣式?大家知道定義樣式可以使用統(tǒng)一風(fēng)格,定義好的樣式,可以重復(fù)使用.再回來看上面設(shè)置樣式方法.

ASP.NET控件開發(fā)基礎(chǔ)之自定義控件樣式屬性2.了解WebControl.BackColor和Style.BackColor

(1)和(2)是差不多的.但(3)則不同,(3)的定義方法有通用性,你可以定義一種樣式,然后利用控件的ApplyStyle方法來引用樣式.給樣式編程提供了方面

WebControl類定義了通用的樣式.(1)和(2)使用的樣式屬性為

WebControl.BackColor

(3)則不同,使用的為

Style.BackColor

3.自定義樣式屬性

剛開始就講了style類為通用的頂級(jí)樣式類,但需求是會(huì)發(fā)生變化的. 好了,下面真正開始編碼了.

下面以改寫label控件為例子

(1)改寫樣式屬性,讓其默認(rèn)背景為紅色,相信大家一定看的懂

示例一

  1. namespace CustomComponents  
  2. {  
  3.     [ToolboxData(@"﹤{0}:ImageLabel1   
  4.     BackColor='Red' 
  5.     runat='server'﹥﹤/{0}:ImageLabel1﹥")  
  6.     ]  
  7.     public class ImageLabel1 : Label  
  8.     {  
  9.         public override string Text  
  10.         {  
  11.             get { return ViewState["Text"] != null ? (string)ViewState["Text"] : base.ID; }  
  12.             set { ViewState["Text"] = value; }  
  13.         }  
  14.  
  15.         public override System.Drawing.Color BackColor  
  16.         {  
  17.             get 
  18.             {  
  19.                 return base.BackColor = System.Drawing.Color.Red;  
  20.             }  
  21.             set 
  22.             {  
  23.                 base.BackColor = value;  
  24.             }  
  25.         }  
  26.     }  

控件初始效果為下圖

控件初始效果 

(2)為label新增一個(gè)背景圖片的屬性,重寫了一下AddAttributesToRender方法,添加一個(gè)樣式屬性,AddAttributesToRender方法以前為大家講過,這里不多講了.

示例二

  1. namespace CustomComponents  
  2. {  
  3.     public class ImageLabel2 : Label  
  4.     {  
  5.         [BrowsableAttribute(true)]  
  6.         [DescriptionAttribute("背景")]  
  7.         [CategoryAttribute("Appearance")]  
  8.         public virtual String ImageUrl  
  9.         {  
  10.             get { return ViewState["imageUrl"] != null ? (string)ViewState["imageUrl"] : ""; }  
  11.             set { ViewState["imageUrl"] = value; }  
  12.         }  
  13.         override protected void AddAttributesToRender(HtmlTextWriter writer)  
  14.         {  
  15.             writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundImage, ImageUrl);  
  16.             base.AddAttributesToRender(writer);  
  17.         }  
  18.     }  

使用控件效果如下

使用控件效果 

(3)上面示例二中我們定義了背景樣式,其實(shí).net已經(jīng)為我們把工作做好了

從style類派生了很多樣式類,擴(kuò)展了style類的屬性,滿足不同控件樣式的需求.

WebControl類中有一個(gè)CreateControlStyle 方法,其返回為一個(gè)樣式集合.其默認(rèn)情況下實(shí)現(xiàn)如下

  1. protected override Style CreateControlStyle()  
  2. {  
  3.     return new Style(ViewState);  

我們可以通過改寫此方法來使控件擁有style派生類的功能,改寫后如下,讓label控件擁有TableStyle類的樣式

  1. protected override Style CreateControlStyle()  
  2. {  
  3.     return new TableStyle(ViewState);  

注意點(diǎn):默認(rèn)情況下,當(dāng)label控件使用ApplyStyle復(fù)制除style之外的樣式屬性集合,將只返回默認(rèn)style類的樣式屬性集合.

看了下面效果后請(qǐng)?jiān)倩仡^再理解這句話.

看下面自定義控件代碼,真是簡(jiǎn)單的不的了

示例三

  1. namespace CustomComponents  
  2. {  
  3.     public class ImageLabel3 : Label  
  4.     {  
  5.  
  6.         protected override Style CreateControlStyle()  
  7.         {  
  8.             return new TableStyle(ViewState);  
  9.         }  
  10.     }  

再看默認(rèn)label控件與其的對(duì)比,因?yàn)闆]有給控件定義樣式屬性,所以只能通過編程的方式來定義樣式,如下

示例四

  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3.     //默認(rèn)label控件  
  4.     TableStyle a = new TableStyle();  
  5.     a.BackImageUrl = "images4.bmp";  
  6.     a.BackColor = System.Drawing.Color.Red;  
  7.     Label1.ApplyStyle(a);  
  8.     //自定義控件  
  9.     ImageLabel3_1.ApplyStyle(a);  

看一下,使用的效果,看到下面效果再來理解下我上面說的注意點(diǎn)吧.我想這樣會(huì)理解的更深刻.

控件效果 

(4)使用派生樣式類,定義控件樣式屬性.示例四中說過了,沒有定義控件樣式屬性,只改寫了CreateControlStyle方法.那就意味了你定義的控件樣式屬性可以直接使用TableStyle類中的屬性,但默認(rèn)情況下的樣式屬性為style類中屬性,所以需要強(qiáng)行轉(zhuǎn)換.如下對(duì)比

默認(rèn)情況下

  1. public override Color BackColor  
  2. {  
  3.     get 
  4.     {  
  5.         return ((Style)ControlStyle).BackColor;  
  6.     }  
  7.     set 
  8.     {  
  9.         ((Style)ControlStyle).BackColor = value;  
  10.     }  

定義TableStyle樣式屬性,必須轉(zhuǎn)換為TableStyle類型

  1. public virtual string BackImageUrl  
  2. {  
  3.     get { return ((TableStyle)ControlStyle).BackImageUrl; }  
  4.     set { ((TableStyle)ControlStyle).BackImageUrl = value; }  

好了,講清楚上面這一點(diǎn).我們?cè)賮頊y(cè)試一下.看下面示例(還是采用我們第一講的例子)

下面只給出定義樣式屬性的代碼,其他的類似.


控件樣式#region 控件樣式

  1. protected override Style CreateControlStyle()  
  2. {  
  3.  
  4.     return new TableStyle(ViewState);  
  5. }  
  6.  
  7. [BrowsableAttribute(true)]  
  8. [DescriptionAttribute("網(wǎng)格線")]  
  9. [CategoryAttribute("Appearance")]  
  10. public virtual GridLines GridLines  
  11. {  
  12.     get { return ((TableStyle)ControlStyle).GridLines; }  
  13.     set { ((TableStyle)ControlStyle).GridLines = value; }  
  14. }  
  15.  
  16. [BrowsableAttribute(true)]  
  17. [DescriptionAttribute("單元格間距")]  
  18. [CategoryAttribute("Appearance")]  
  19. public virtual int CellSpacing  
  20. {  
  21.     get { return ((TableStyle)ControlStyle).CellSpacing; }  
  22.     set { ((TableStyle)ControlStyle).CellSpacing = value; }  
  23. }  
  24.  
  25. [BrowsableAttribute(true)]  
  26. [DescriptionAttribute("單元格邊距")]  
  27. [CategoryAttribute("Appearance")]  
  28. public virtual int CellPadding  
  29. {  
  30.     get { return ((TableStyle)ControlStyle).CellPadding; }  
  31.     set { ((TableStyle)ControlStyle).CellPadding = value; }  
  32. }  
  33.  
  34. [BrowsableAttribute(true)]  
  35. [DescriptionAttribute("表水平對(duì)齊")]  
  36. [CategoryAttribute("Appearance")]  
  37. public virtual HorizontalAlign HorizontalAlign  
  38. {  
  39.     get { return ((TableStyle)ControlStyle).HorizontalAlign; }  
  40.     set { ((TableStyle)ControlStyle).HorizontalAlign = value; }  
  41. }  
  42.  
  43. [BrowsableAttribute(true)]  
  44. [DescriptionAttribute("表背景圖片")]  
  45. [CategoryAttribute("Appearance")]  
  46. public virtual string BackImageUrl  
  47. {  
  48.     get { return ((TableStyle)ControlStyle).BackImageUrl; }  
  49.     set { ((TableStyle)ControlStyle).BackImageUrl = value; }  
  50. }  
  51.  
  52. #endregion 

使用此控件

  1. ﹤custom:CreditCardForm6 BackColor="Black" ForeColor="White" runat="server" ID="example" 
  2.   Font-Bold="true" Font-Italic="true" GridLines="None" CellSpacing="5"   
  3.   BackImageUrl="images4.bmp" Font-Size="Larger" 
  4.   BorderColor="Yellow" BorderWidth="20px" BorderStyle="Ridge" HorizontalAlign="NotSet" EnableViewState="False" /﹥ 

效果如下

控件效果 

好了,上面的基礎(chǔ)講完了.希望大家能夠有所理解.下面還我們要講一個(gè)重點(diǎn)的東西.

ASP.NET控件開發(fā)基礎(chǔ)之自定義控件樣式屬性4.自定義類型化樣式屬性

如果樣式屬性無法滿足你需求,則你可以通過自定義類型化樣式來實(shí)現(xiàn).

什么是自定義類型化樣式?就是該類從style類派生,對(duì)其進(jìn)行修改和擴(kuò)充(書上就這么寫了...我就這么理解了-_-)

如Table控件,一方面控件自身定義的樣式屬性,另一方面又定義了TableStyle類.你可以在使用控件樣式屬性和TableStyle類中進(jìn)行選擇.

但TableStyle類具有通用性,具有一定的靈活性.好了下面我們又要開始看代碼了.當(dāng)然從簡(jiǎn)單開始

(1)簡(jiǎn)單呈現(xiàn)樣式屬性

ASP.NET控件開發(fā)基礎(chǔ)之自定義控件樣式屬性需要說明的注意點(diǎn)如下

1.重寫LabelStyle(StateBag viewState)構(gòu)造函數(shù)

2.樣式屬性需用視圖狀態(tài)來聲明

3.Style類的重載的AddAttributesToRender方法需用兩個(gè)參數(shù)的方法

AddAttributesToRender(HtmlTextWriter writer, WebControl owner)

示例5  自定義類型化樣式:LabelStyle類  

  1. public class LabelStyle :Style  
  2. {  
  3.     public LabelStyle() { }  
  4.     public LabelStyle(StateBag viewState) : base(viewState) { }  
  5.  
  6.     public virtual String ImageUrl  
  7.     {  
  8.         get { return ViewState["imageUrl"] != null ? (string)ViewState["imageUrl"] : ""; }  
  9.         set { ViewState["imageUrl"] = value; }  
  10.     }  
  11.  
  12.     public override void AddAttributesToRender(HtmlTextWriter writer, WebControl owner)  
  13.     {  
  14.         writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundImage, ImageUrl);  
  15.  
  16.           
  17.         base.AddAttributesToRender(writer, owner);  
  18.     }  

下面再來看控件實(shí)現(xiàn)方法,注意此處CreateControlStyle方法返回為自己定義的LabelStyle(ViewState)

示例6

  1. public class ImageLabel4 : Label  
  2. {  
  3.     protected override Style CreateControlStyle()  
  4.     {  
  5.         return new LabelStyle(ViewState);  
  6.     }  
  7.  
  8.     [Bindable(true),  
  9.     Category("Appearance"),  
  10.     DefaultValue(""),  
  11.     Description("背景圖片")  
  12.     ]   
  13.     public virtual String ImageUrl  
  14.     {  
  15.         get { return ((LabelStyle)ControlStyle).ImageUrl; }  
  16.         set { ((LabelStyle)ControlStyle).ImageUrl = value; }  
  17.     }  

讓我們來測(cè)試一下,你會(huì)發(fā)現(xiàn)界面上并未呈現(xiàn)背景圖片,給控件加一個(gè)屬性CssClass=""以后效果就出來了,如下

控件效果 

讓我們來思考為什么在未定義CssClass=""屬性時(shí)無法呈現(xiàn)自定義屬性.

Style類有一個(gè)IsEmpty屬性用來判斷已在的視圖狀態(tài)中是否定義了樣式屬性,
默認(rèn)情況下為true,當(dāng)定義了樣式屬性后,則為false.CssClass屬性為空時(shí),默認(rèn)情況下即認(rèn)為定義了樣式屬性,只不過樣式屬性個(gè)數(shù)為0.

若要在默認(rèn)情況下呈現(xiàn)自定義樣式屬性則需重寫IsEmpty屬性.如下,只要判斷自定義的樣式屬性視圖狀態(tài)是否為空即可.

示例7

  1. //判斷視圖狀態(tài)是否為空  
  2. internal bool IsSet(string key)  
  3. {  
  4.     return ViewState[key] != null;  
  5. }  
  6.  
  7. /**//// ﹤summary﹥  
  8. /// 是否定義樣式元素  
  9. /// ﹤/summary﹥  
  10. public override bool IsEmpty  
  11. {  
  12.     get 
  13.     {  
  14.         return base.IsEmpty && !IsSet("imageUrl");  
  15.     }  

(2)使用編程

下面我們以編程方式,給控件添加自定義樣式屬性.
發(fā)現(xiàn)BackColor屬性能夠呈現(xiàn)但I(xiàn)mageUrl 無法呈現(xiàn),那說明我們剛才自定義的類就失去意義了,也說明我們還未重寫某個(gè)方法.

  1. LabelStyle a = new LabelStyle();  
  2.      a.ImageUrl = "images4.bmp";  
  3.      a.BackColor = System.Drawing.Color.Red;  
  4.      ImageLabel4_1.ApplyStyle(a); 

Style類有三個(gè)操作樣式的方法,復(fù)制,合并和清除樣式.WebControl類也一樣.重寫一下,我們的目的就達(dá)到了.看下面代碼

示例8

方法#region 方法

  1. /**//// ﹤summary﹥  
  2. ///  復(fù)制樣式  
  3. /// ﹤/summary﹥  
  4. /// ﹤param name=""﹥﹤/param﹥  
  5. public override void CopyFrom(Style s)  
  6. {  
  7.     if (s == null)  
  8.         return;  
  9.  
  10.     base.CopyFrom(s);  
  11.     LabelStyle ls = s as LabelStyle;  
  12.     if (ls == null || ls.IsEmpty)  
  13.         return;  
  14.  
  15.     if (ls.IsSet("imageUrl"))  
  16.         this.ImageUrl = ls.ImageUrl;  
  17. }  
  18.  
  19. /**//// ﹤summary﹥  
  20. /// 整合樣式  
  21. /// ﹤/summary﹥  
  22. /// ﹤param name="s"﹥﹤/param﹥  
  23. public override void MergeWith(Style s)  
  24. {  
  25.     if (s == null)  
  26.         return;  
  27.  
  28.     if (IsEmpty)  
  29.     {  
  30.         CopyFrom(s);  
  31.         return;  
  32.     }  
  33.  
  34.     LabelStyle ls = s as LabelStyle;  
  35.     if (ls == null || ls.IsEmpty)  
  36.         return;  
  37.  
  38.     if (ls.IsSet("imageUrl") && !IsSet("imageUrl"))  
  39.         this.ImageUrl = ls.ImageUrl;  
  40. }  
  41.  
  42. /**//// ﹤summary﹥  
  43. /// 清除樣式  
  44. /// ﹤/summary﹥  
  45. public override void Reset()  
  46. {  
  47.     base.Reset();  
  48.     if (IsEmpty)  
  49.         return;  
  50.  
  51.     if (IsSet("imageUrl"))  
  52.         ViewState.Remove("imageUrl");  
  53. }  
  54. #endregion 

好了,再次編譯測(cè)試一下,效果也出來了.

這里再寫一點(diǎn).再呈現(xiàn)的時(shí)候可以重寫另一個(gè)方法來代替AddAttributesToRender方法,如下

  1. protected override void FillStyleAttributes(CssStyleCollection attributes, IUrlResolutionService urlResolver)  
  2. {  
  3.     base.FillStyleAttributes(attributes, urlResolver);  
  4.     attributes.Add(HtmlTextWriterStyle.BackgroundImage, ImageUrl);  

關(guān)于對(duì)樣式的理解基本的東西就先寫這么多吧.大家看完了再回去看看,注意步驟就可以了.重在理解.

好久沒寫了發(fā)現(xiàn)自己寫的又挺長(zhǎng)的,寫的好累呀...希望對(duì)大家有幫助吧.

ASP.NET控件開發(fā)基礎(chǔ)之自定義控件樣式屬性的基本情況就向你介紹到這里,希望對(duì)你有所幫助。

【編輯推薦】

  1. ASP.NET控件開發(fā)基礎(chǔ)之事件處理淺析
  2. ASP.NET服務(wù)器控件之RenderContents簡(jiǎn)介
  3. ASP.NET服務(wù)器控件之RenderContents應(yīng)用示例
  4. ASP.NET控件開發(fā)基礎(chǔ)之RenderContents使用淺析
  5. ASP.NET自定義控件屬性淺析
責(zé)任編輯:仲衡 來源: 博客園
相關(guān)推薦

2009-08-06 09:18:01

ASP.NET自定義控ASP.NET控件開發(fā)

2009-08-06 17:13:56

ASP.NET自定義控

2009-07-28 09:32:41

ASP.NET自定義控

2009-08-10 14:16:59

ASP.NET自定義控

2009-08-07 11:12:58

ASP.NET控件開發(fā)

2009-08-06 18:18:27

ASP.NET控件開發(fā)ASP.NET復(fù)合控件

2009-07-31 10:23:09

ASP.NET源碼DateTimePic

2011-04-19 10:33:16

ASP.NET自定義控

2009-08-07 13:31:41

ASP.NET控件開發(fā)

2009-08-07 14:05:21

ASP.NET控件

2009-08-04 13:35:16

ASP.NET自定義樣

2009-08-07 10:34:56

ASP.NET控件開發(fā)

2009-08-06 15:21:45

ASP.NET控件開發(fā)RenderConte

2009-08-07 15:24:16

ASP.NET模板控件

2009-07-28 16:21:03

Asp.net AjaAutoComplet

2009-08-06 13:08:23

ASP.NET控件開發(fā)

2009-08-06 18:32:00

ASP.NET控件開發(fā)ASP.NET復(fù)合控件

2009-08-05 18:46:21

ComboBox顯示ASP.NET控件開發(fā)

2009-07-27 17:25:53

ASP.NET驗(yàn)證控件

2009-08-07 15:34:15

ASP.NET數(shù)據(jù)綁定
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)