电竞比分网-中国电竞赛事及体育赛事平台

分享

創(chuàng)建可供用戶選擇的主題

 悟靜 2012-02-16

創(chuàng)建可供用戶選擇的主題

主題是ASP.NET 2.0中的新功能,能夠?qū)W(wǎng)頁外觀進(jìn)行更多的控制。主題可以定義顏色配置、字體名稱、字體大小和樣式、甚至是圖片(是方角還是圓角,或者使用不同的顏色和陰影)。ASP.NET 2.0中增加了對(duì)"skin"的支持,這是對(duì)CSS想法的一種擴(kuò)展。每個(gè)用戶都可以從列表中選擇一個(gè)主題,所選的主題決定了該用戶會(huì)話期間網(wǎng)頁的外觀格式設(shè)置(稱為"skin"),相對(duì)CSS樣式表來說,skin是在服務(wù)器端的。skin文件與CSS文件類似,但與CSS不同的是,skin能夠把頁面中服務(wù)器端控件顯式設(shè)置的外觀屬性值覆蓋掉(全局CSS無法覆蓋單獨(dú)控件上的設(shè)置)??梢杂弥黝}來保存不同版本的圖片,這樣如果想擁有幾套在當(dāng)前skin基礎(chǔ)上使用不同顏色配置的圖片,這就能用到主題。然而,主題不能替代CSS,可以將CSS文件和skin文件結(jié)合起來使用實(shí)現(xiàn)靈活控制。至于樣式表文件,在ASP.NET 2.0中沒有什么創(chuàng)新,除了允許為一些新控件指定其CssClass屬性外,還增加了一些可視化設(shè)計(jì)器支持的控件,以便能夠?yàn)樗鼈冞x擇預(yù)定義的CSS樣式。

主題是存放在網(wǎng)站App_Themes文件夾中子文件夾下的一組文件,包含以下項(xiàng)目:

CSS樣式表文件,其中包含了對(duì)HTML對(duì)象外觀的定義。

skin文件--這些文件定義了ASP.NET服務(wù)器端控件的外觀,可以認(rèn)為Skin文件是服務(wù)器端的樣式表文件。

其他資源,例如圖片。

ASP.NET 2.0在實(shí)現(xiàn)主題的方法上有個(gè)很酷的地方:當(dāng)在頁面上應(yīng)用主題時(shí),ASP.NET在運(yùn)行時(shí)會(huì)自動(dòng)為每個(gè)頁面添加一個(gè)<link>元標(biāo)記,用來鏈接主題文件夾中的各個(gè)CSS文件。這樣很方便,因?yàn)閷?duì)已存在的CSS文件重命名,或者增加新的CSS文件,頁面仍然能夠自動(dòng)地鏈接它們。這個(gè)功能尤其重要,因?yàn)槟軌驅(qū)崿F(xiàn)在運(yùn)行時(shí)動(dòng)態(tài)更換主題(就像更換模板頁面)的功能,ASP.NET會(huì)對(duì)新主題文件夾中的文件進(jìn)行鏈接,這樣網(wǎng)站的外觀就得以改變,從而適合不同用戶的喜好。如果沒有這個(gè)機(jī)制,就需要根據(jù)瀏覽者所選的主題為每一個(gè)頁面手工創(chuàng)建<link>元標(biāo)記,這是非常困難的。

在主題這一類功能中最好的是服務(wù)器端樣式表,稱為skin文件。它們的擴(kuò)展名為.skin,包括了對(duì)ASP.NET控件的聲明,如下所示:

<asp:TextBox runat="server" BorderStyle="Dashed" BorderWidth="1px" />

除了在skin中聲明時(shí)不需要指定控件的ID外,所有在.aspx頁面中的聲明都是需要指定控件ID的。當(dāng)在頁面上應(yīng)用skin文件后,頁面上的控件就采用skin文件中所指定的外觀樣式。對(duì)于TextBox控件來說這似乎沒有什么優(yōu)勢(shì),因?yàn)橐部梢栽贑SS樣式表文件中為<input>定義一個(gè)樣式類。然而,很多復(fù)雜控件都不能這樣處理,例如Calendar、DataGrid (或者新的GridView 控件)等,這就要花費(fèi)很多精力了,因?yàn)檫@些控件之間無法用一個(gè)HTML元素聯(lián)系起來,因此不能輕易地在樣式表文件中通過單個(gè)類為它們定義樣式。

注意:

可以用單獨(dú)的.skin文件來存放對(duì)任何控件類型的定義,也可以為每種控件類型創(chuàng)建單獨(dú)的.skin文件,例如TextBox.skin、DataGrid.skin和Canlendar.skin等,在運(yùn)行時(shí),這些文件會(huì)在內(nèi)存中合并起來。這取決于開發(fā)人員更喜歡哪種方式。

對(duì)某一頁面應(yīng)用主題,需要使用@Page指令中的Theme屬性:

<%@ Page Language="C#" Theme="NiceTheme" 
MasterPageFile="~/MasterPage.master" ... %>
對(duì)所有頁面應(yīng)用某個(gè)主題,就需要對(duì)web.config中<pages>元素的theme 屬性進(jìn)行設(shè)置,如下所示:
<pages theme="NiceTheme" masterPageFile="~/MasterPage.master" />
對(duì)于模板頁面,也可以通過編程來改變主題,在Page 類的PreInit事件中編寫代碼。例如,下面展示了如何應(yīng)用一個(gè)主題,主題的名稱存放在一個(gè)Session 變量中:
protected void Page_PreInit(object sender, EventArgs e)
{
if (this.Session["CurrentTheme"] != null)
this.Theme = this.Session["CurrentTheme"];
}

在第4章中,將對(duì)這種機(jī)制進(jìn)行改進(jìn),使用新的Profile屬性來代替使用Session變量。

在使用@Page指令(或者是web.config)的Theme 屬性時(shí),skin文件中定義的屬性值會(huì)將.aspx文件中指定的值覆蓋掉。如果想讓主題也能像CSS樣式表那樣工作,也就是說,對(duì)于特定的控件,在.skin文件中定義的樣式可以在.aspx頁面中重新進(jìn)行指定,這樣就只能在@Page指令中設(shè)置StylesheetTheme屬性為一個(gè)主題?;蛘呤窃O(shè)置web.config文件中<pages> 元素的styleSheetTheme屬性為一個(gè)主題,請(qǐng)不要將Theme屬性與StylesheetTheme屬性混淆。

到此為止,已經(jīng)介紹了未命名的(unnamed)skin--能為同一類型的所有控件定義外觀的skin。然而,有時(shí)需要讓某個(gè)控件的外觀與skin文件中所定義的不同,這時(shí),可以采用以下三種方法:

1. 前面已經(jīng)提到過,可以通過StylesheetTheme屬性應(yīng)用一個(gè)主題(不是Theme 屬性),這樣在.aspx文件中設(shè)置的視覺屬性會(huì)將skin文件中定義的覆蓋掉。然而主題機(jī)制的默認(rèn)行為是確保同一類型的所有控件有同樣的外觀,因?yàn)楫?dāng)有多個(gè)頁面開發(fā)人員時(shí),不能確保每個(gè)開發(fā)人員是否在嚴(yán)格要求下才會(huì)在.aspx頁面中使用特性。

2. 只對(duì)該控件禁用主題,然后像正常情況一樣為它設(shè)置外觀,如以下代碼所示:

<asp:TextBox runat="server" ID="btnSubmit" EnableTheming="False" 
BorderStyle="Dotted" BorderWidth="2px" />
3. 為控件使用已命名的skin,即使用SkinID屬性來引用一個(gè)定義好的skin,如下所示:
<asp:Label runat="server" SkinID="FeedbackOK" ForeColor="green" />
<asp:Label runat="server" SkinID="FeedbackKO" ForeColor="red" />
當(dāng)聲明控件時(shí),需要為它的SkinID 屬性設(shè)置一個(gè)相匹配的值,如下所示:
<asp:Label runat="server" ID="lblFeedbackOK"
Text="Your message has been successfully sent."
SkinID="FeedbackOK" Visible="false" />
<asp:Label runat="server" ID="lblFeedbackKO"
Text="Sorry, there was a problem sending your message."
SkinID="FeedbackKO" Visible="false" />

我認(rèn)為這是最好的可行辦法,因?yàn)樗试S為同一個(gè)控件類型定義多個(gè)外觀,且都放在一個(gè)單獨(dú)文件中,然后可以應(yīng)用在任何頁面中。另外,如果保持所有格式定義在skin文件中而不是定義在頁面本身,就可以完全通過切換當(dāng)前主題來改變網(wǎng)站的外觀(這就是設(shè)計(jì)主題的目的所在)。否則,使用硬編碼樣式,是不可能完全實(shí)現(xiàn)的。

在本章"解決方案"部分將使用主題為模板頁面創(chuàng)建一些不同的外觀。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多