ASP.NET 2.0 的主題功能將樣式與版面配置抽離為獨立檔案集合,讓開發人員能輕鬆切換網站外觀,無需逐頁修改。主題包含 .skin 檔(控制項屬性設定)、.css 樣式表、圖片等資源,統一存放於 App_Themes 目錄下。
App_Themes/
├── Blue/
│ ├── Blue.skin
│ ├── Style.css
│ └── Images/
│ └── logo.png
├── Red/
│ ├── Red.skin
│ ├── Style.css
│ └── Images/
│ └── logo.png
└── Default/
└── ...
| 範圍 | 屬性名稱 | 設定位置 | 優先順序 |
|---|---|---|---|
| 全站 | theme | web.config <pages theme="Blue"> | 低 |
| 全站(可覆寫) | styleSheetTheme | web.config <pages styleSheetTheme="Blue"> | 最低 |
| 單一頁面 | Theme | @Page Theme="Blue" | 高 |
| 單一頁面(可覆寫) | StyleSheetTheme | @Page StyleSheetTheme="Blue" | 中 |
<asp:Label runat="server" BackColor="Blue" ForeColor="White" Font-Bold="true" />
<asp:Button runat="server" BackColor="Navy" ForeColor="White" />
所有同類型控制項自動套用,除非控制項明確設定 EnableTheming="false"。
<asp:Label runat="server" SkinID="Header" Font-Size="24px" ForeColor="DarkBlue" />
<asp:Label runat="server" SkinID="Error" ForeColor="Red" Font-Bold="true" />
使用時需在控制項指定 SkinID="Header"。
<asp:Image runat="server" ImageUrl="Images/logo.png" />
執行時會自動解析為 App_Themes/CurrentTheme/Images/logo.png。
必須在 Page_PreInit 事件中設定,否則會擲出例外:
protected void Page_PreInit(object sender, EventArgs e) {
string theme = Request.Cookies["Theme"]?.Value ?? "Blue";
Page.Theme = theme;
}
<asp:Label runat="server" BackColor="Blue" ForeColor="White" />
<asp:Label runat="server" SkinID="Dark" BackColor="DarkBlue" ForeColor="White" />
<asp:Image runat="server" ImageUrl="Images/banner.jpg" />
<asp:Button runat="server" BackColor="SteelBlue" ForeColor="White" />
<asp:Label runat="server" BackColor="Red" ForeColor="White" />
<asp:Label runat="server" SkinID="Dark" BackColor="DarkRed" ForeColor="White" />
<asp:Image runat="server" ImageUrl="Images/banner.jpg" />
<asp:Button runat="server" BackColor="Firebrick" ForeColor="White" />
<%@ Page Theme="Blue" %>
<asp:Label ID="lblTitle" runat="server" Text="歡迎光臨" SkinID="Header" />
<asp:Label ID="lblMsg" runat="server" Text="這是一般標籤" />
<asp:Image ID="imgBanner" runat="server" />
在 MasterPage 中設定 Theme 或 StyleSheetTheme,所有內容頁自動繼承。若內容頁需覆寫,可在內容頁的 Page_PreInit 中重新指定。
styleSheetTheme 作為基礎風格,Theme 作為強制覆寫層