新聞中心
上一篇討論了視圖狀態(tài)的用法,讓我們?cè)倩氐降诎似臅r(shí)候.從第八篇的時(shí)候跳了很大篇幅來(lái)繼續(xù)講屬性,然后接著講類(lèi)型轉(zhuǎn)換器,再接著講視圖狀態(tài).繞到現(xiàn)在才接著講復(fù)合控件的樣式的使用,因?yàn)樯厦嬷v的東西是緊密聯(lián)系的.如果已經(jīng)理解自定義視圖狀態(tài)管理,那這一篇?jiǎng)t看起來(lái)相關(guān)的簡(jiǎn)單.

創(chuàng)新互聯(lián)是專(zhuān)業(yè)的阿瓦提網(wǎng)站建設(shè)公司,阿瓦提接單;提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行阿瓦提網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
ASP.NET控件開(kāi)發(fā)基礎(chǔ)之為子控件添加樣式1.復(fù)合控件中樣式屬性概述
在第六篇的時(shí)候已經(jīng)介紹過(guò)樣式的使用了,在復(fù)合控件中你同樣可以用此方法給控件定義多個(gè)樣式屬性,但此方法很適合像label這樣非復(fù)合控件.
當(dāng)然復(fù)合控件可以適當(dāng)?shù)亩x其自身的樣式屬性,同時(shí)你還需要為其子控件提供樣式,典型的控件如GridView控件,如下圖
它有很多不同種類(lèi)的列,而每種不同的列則有不同的樣式集合屬性,如果將其每個(gè)樣式屬性均暴露為***屬性,那樣式屬性將變得很混亂.
我們可以用此方法為復(fù)合控件的子控件定義樣式,實(shí)現(xiàn)每個(gè)子控件對(duì)應(yīng)Style類(lèi)型的復(fù)雜樣式屬性,將樣式屬性暴露為復(fù)合控件的***屬性,這樣更容易管理復(fù)合控件樣式屬性.
ASP.NET控件開(kāi)發(fā)基礎(chǔ)之為子控件添加樣式2.復(fù)合控件中樣式屬性實(shí)現(xiàn)(為子控件提供樣式)
Style類(lèi)本身繼承IStateManager 接口,并實(shí)現(xiàn)了接口方法.在第五篇我們?cè)貙?xiě)CreateControlStyle方法,如下
- protected override Style CreateControlStyle()
- {
- return new Style(ViewState);
- }
其初始化的時(shí)候即存儲(chǔ)樣式信息在視圖狀態(tài)中,而其自定義的樣式的狀態(tài)管理機(jī)制則跟上一篇非常的相似.你需要重寫(xiě)Control類(lèi)的狀態(tài)管理的幾個(gè)方法來(lái)實(shí)現(xiàn)樣式的狀態(tài)管理.還是以登錄控件為例.
(1)先自定義樣式集合屬性
定義方法跟上一篇視圖狀態(tài)中的Address屬性很相似
如下代碼
- #region 樣式屬性
- [
- Category("Styles"),
- DefaultValue(null),
- DesignerSerializationVisibility(
- DesignerSerializationVisibility.Content),
- PersistenceMode(PersistenceMode.InnerProperty),
- Description(
- "應(yīng)用于按鈕的樣式")
- ]
- public virtual Style ButtonStyle
- {
- get
- {
- if (_buttonStyle == null)
- {
- _buttonStyle = new Style();
- if (IsTrackingViewState)
- {
- ((IStateManager)_buttonStyle).TrackViewState();
- }
- }
- return _buttonStyle;
- }
- }
- [
- Category("Styles"),
- DefaultValue(null),
- DesignerSerializationVisibility(
- DesignerSerializationVisibility.Content),
- PersistenceMode(PersistenceMode.InnerProperty),
- Description(
- "應(yīng)用于文本框的樣式")
- ]
- public virtual Style TextBoxStyle
- {
- get
- {
- if (_textBoxStyle == null)
- {
- _textBoxStyle = new Style();
- if (IsTrackingViewState)
- {
- ((IStateManager)_textBoxStyle).TrackViewState();
- }
- }
- return _textBoxStyle;
- }
- }
- #endregion
(2)自定義視圖狀態(tài)管理
因?yàn)榇颂幎x了兩個(gè)樣式集合屬性,所以用到了Triplet這個(gè)輔助類(lèi),其跟Pair類(lèi)一樣都是輔助類(lèi),而其可以存儲(chǔ)三個(gè)相關(guān)對(duì)象的基本結(jié)構(gòu).如果你要儲(chǔ)存三個(gè)以上就不能用這兩個(gè)輔助類(lèi)了,實(shí)現(xiàn)方法還是很簡(jiǎn)單的.
如下代碼
- #region 自定義視圖狀態(tài)
- protected override void LoadViewState(object savedState)
- {
- if (savedState == null)
- {
- base.LoadViewState(null);
- return;
- }
- else
- {
- Triplet t = savedState as Triplet;
- if (t != null)
- {
- base.LoadViewState(t.First);
- if ((t.Second) != null)
- {
- ((IStateManager)ButtonStyle).LoadViewState(t.Second);
- }
- if ((t.Third) != null)
- {
- ((IStateManager)TextBoxStyle).LoadViewState(t.Third);
- }
- }
- else
- {
- throw new ArgumentException("Invalid view state .");
- }
- }
- }
- protected override object SaveViewState()
- {
- object baseState = base.SaveViewState();
- object buttonStyleState = null;
- object textBoxStyleState = null;
- if (_buttonStyle != null)
- {
- buttonStyleState =
- ((IStateManager)_buttonStyle).SaveViewState();
- }
- if (_textBoxStyle != null)
- {
- textBoxStyleState =
- ((IStateManager)_textBoxStyle).SaveViewState();
- }
- return new Triplet(baseState,
- buttonStyleState, textBoxStyleState);
- }
- protected override void TrackViewState()
- {
- base.TrackViewState();
- if (_buttonStyle != null)
- {
- ((IStateManager)_buttonStyle).TrackViewState();
- }
- if (_textBoxStyle != null)
- {
- ((IStateManager)_textBoxStyle).TrackViewState();
- }
- }
- #endregion
(3)為子控件添加樣式集合屬性
上面工作做好后,然后你就可以在呈現(xiàn)方法Render方法或RenderContent方法中為子控件添加樣式集合屬性,如下代碼
- if (_buttonStyle != null)
- {
- submitButton.ApplyStyle(ButtonStyle);
- }
- if (_textBoxStyle != null)
- {
- nameTextBox.ApplyStyle(TextBoxStyle);
- emailTextBox.ApplyStyle(TextBoxStyle);
- }
來(lái)看一下效果,屬性面板已經(jīng)有子控件樣式集合屬性了,這樣就更容易管理樣式了.
定義子控件樣式就這么的簡(jiǎn)單,主要難點(diǎn)還是在于自定義視圖狀態(tài)管理,對(duì)自定義視圖狀態(tài)管理熟悉的話,看到這里肯定很簡(jiǎn)單,如果沒(méi)看明白就須先弄懂如何自定義視圖狀態(tài)管理.
注意點(diǎn):ASP.NET中復(fù)合控件可以直接繼承CompositeControl類(lèi)即可,大家可以了解一下此類(lèi)。
ASP.NET控件開(kāi)發(fā)基礎(chǔ)之為子控件添加樣式的基本情況就向你介紹到這里,希望你對(duì)ASP.NET控件開(kāi)發(fā)基礎(chǔ)之為子控件添加樣式有所了解。
【編輯推薦】
- ASP.NET控件開(kāi)發(fā)基礎(chǔ)之復(fù)合控件淺析
- ASP.NET控件開(kāi)發(fā)基礎(chǔ)之復(fù)合控件事件處理淺析
- ASP.NET控件開(kāi)發(fā)基礎(chǔ)之類(lèi)型轉(zhuǎn)換器淺析
- ASP.NET控件開(kāi)發(fā)基礎(chǔ)之實(shí)現(xiàn)控件集合屬性
- ASP.NET控件開(kāi)發(fā)基礎(chǔ)之自定義視圖狀態(tài)管理
分享文章:ASP.NET控件開(kāi)發(fā)基礎(chǔ)之為子控件添加樣式
網(wǎng)站路徑:http://fisionsoft.com.cn/article/djcjsij.html


咨詢(xún)
建站咨詢(xún)
