|
創(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控件的聲明,如下所示:
除了在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屬性:
在第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. 只對該控件禁用主題,然后像正常情況一樣為它設置外觀,如以下代碼所示:
我認為這是最好的可行辦法,因為它允許為同一個控件類型定義多個外觀,且都放在一個單獨文件中,然后可以應用在任何頁面中。另外,如果保持所有格式定義在skin文件中而不是定義在頁面本身,就可以完全通過切換當前主題來改變網(wǎng)站的外觀(這就是設計主題的目的所在)。否則,使用硬編碼樣式,是不可能完全實現(xiàn)的。 在本章"解決方案"部分將使用主題為模板頁面創(chuàng)建一些不同的外觀。 |
|
|
來自: 悟靜 > 《.net和asp.net》