小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 悟靜 2012-02-16

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

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

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

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

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

其他資源,例如圖片。

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

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

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

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

注意:

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

對某一頁面應用主題,需要使用@Page指令中的Theme屬性:

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

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

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

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

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

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

<asp:TextBox runat="server" ID="btnSubmit" EnableTheming="False" 
BorderStyle="Dotted" BorderWidth="2px" />
3. 為控件使用已命名的skin,即使用SkinID屬性來引用一個定義好的skin,如下所示:
<asp:Label runat="server" SkinID="FeedbackOK" ForeColor="green" />
<asp:Label runat="server" SkinID="FeedbackKO" ForeColor="red" />
當聲明控件時,需要為它的SkinID 屬性設置一個相匹配的值,如下所示:
<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" />

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

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多