天天看點

在 ASP.NET 2.0 中建立 Web 應用程式主題(二)

清單2中的頁面包含用于詢問使用者名的窗體。除了在頁面頂部添加了主題指令之外,此頁面沒有任何特殊的地方。該主題指令用于将OrangeTheme主題應用于頁面。

當您在Web浏覽器中打開清單2中的頁面時,TextBox和Button控件将使用在Skin檔案中聲明的格式設定來顯示(請參見圖1)。

圖1:将簡單主題應用于ASP.NET頁面

Skin檔案可以包含比清單1中所包含的格式設定更複雜的格式設定。例如,清單3中的GridView.Skin檔案包含了用作GridView控件的格式設定的腳本和模闆。(在ASP.NET2.0Framework中,GridView控件替換了DataGrid控件。)

清單3:GridView.Skin(C#)

<scriptlanguage="C#"runat="Server">stringDisplayInStock(objectinStock){if((Int16)inStock>0)return"InStock";elsereturn"OutofStock";}</script><asp:GridViewAutoGenerateColumns="false"ShowHeader="false"CellPadding="5"Font-Name="Arial"Runat="Server"><AlternatingRowStyleBackColor="LightBlue"/><Columns><asp:TemplateField><ItemTemplate><%#Eval("ProductName")%></ItemTemplate></asp:TemplateField><asp:BoundFieldDataField="UnitPrice"DataFormatString="{0:c}"/><asp:TemplateField><ItemTemplate><%#DisplayInStock(Eval("UnitsInStock"))%></ItemTemplate></asp:TemplateField></Columns></asp:GridView>

清單3:GridView.Skin(VisualBasic.NET)

<scriptlanguage="VB"runat="Server">FunctionDisplayInStock(inStockAsObject)AsStringIfCType(inStock,Int16)>0ThenReturn"InStock"ElseReturn"OutofStock"EndIfEndFunction</script><asp:GridViewAutoGenerateColumns="false"ShowHeader="false"CellPadding="5"Font-Name="Arial"Runat="Server"><AlternatingRowStyleBackColor="LightBlue"/><Columns><asp:TemplateField><ItemTemplate><%#Eval("ProductName")%></ItemTemplate></asp:TemplateField><asp:BoundFieldDataField="UnitPrice"DataFormatString="{0:c}"/><asp:TemplateField><ItemTemplate><%#DisplayInStock(Eval("UnitsInStock"))%></ItemTemplate></asp:TemplateField></Columns></asp:GridView>

清單3中的Skin檔案包含一個GridView控件,該控件具有三列(請參見圖2)。第一列是一個TemplateField列,用于顯示ProductName字段的值。第二列是一個BoundField列,用于顯示UnitPrice字段(請注意,此列使用DataFormatString屬性将價格形式設定為貨币)。最後,第三列是另一個TemplateField列。此列将從Skin檔案所包含的腳本中調用DisplayUnitsInStock方法,以顯示文本“InStock”或“OutofStock”。

圖2:複雜的GridView外觀

您可以将GridView.Skin外觀用于清單4中的頁面(假如您已将該外觀添加到了OrangeTheme檔案夾中)。

清單4:SkinnedGridView.aspx

<%@PageTheme="OrangeTheme"%><html><headrunat="server"><title>SkinnedGridView</title></head><body><formid="form1"runat="server"><asp:GridViewID="GridView1"DataSourceID="ProductSource"Runat="Server"/><asp:SqlDataSourceID="ProductSource"ConnectionString="Server=localhost;Trusted_Connection=true;Database=Northwind"SelectCommand="SelectProductName,UnitPrice,UnitsInStockFROMProducts"Runat="Server"/></form></body></html>

清單4中的頁面顯示了Products資料庫表中的内容。該頁面包含一個綁定到SqlDataSource控件的GridView控件。SqlDataSource控件用于連接配接到Northwind資料庫表,以檢索該資料庫中的資料。

傳回頁首

預設外觀與命名外觀

在上一部分中,您學習了如何建立應用于某一類控件的所有執行個體的外觀。例如,您學習了如何建立應用于所有TextBox控件或GridView控件的外觀。但是,您很快就會發現,您需要為同一控件建立多個外觀。例如,您會希望能夠将不同外觀應用于不同頁面(甚至同一頁面)中的GridView控件。

如果您建立的是“命名外觀”,那麼就可以建立應用于同一類控件的多個外觀。命名外觀就是包含SkinID的外觀。例如,清單5中的Skin檔案包含了三個可以應用于TextBox控件的外觀。

清單5:TextBox.Skin

<asp:TextBoxBackColor="Green"Runat="Server"/><asp:TextBoxSkinID="BlueTextBox"BackColor="Blue"Runat="Server"/><asp:TextBoxSkinID="RedTextBox"BackColor="Red"Runat="Server"/>

在清單5中,第一個TextBox外觀稱為預設外觀。由于該外觀不包含SkinID,是以,預設情況下,該外觀應用于所有TextBox控件。而第二個和第三個TextBox外觀包含各自的SkinID屬性值。隻有在通過其SkinID值明确引用這兩個外觀時,它們才應用于TextBox控件。

例如,清單6中的頁面使用了TextBox.SkinSkin檔案中的全部三個外觀。

清單6:SkinnedTextBoxes.aspx

<%@PageTheme="OrangeTheme"%><html><headrunat="server"><title>SkinnedTextBoxes</title></head><body><formid="form1"runat="server"><asp:TextBoxid="TextBox1"Runat="Server"/><br/><asp:TextBoxid="TextBox2"SkinID="BlueTextBox"Runat="Server"/><br/><asp:TextBoxid="TextBox3"SkinID="RedTextBox"Runat="Server"/></form></body></html>

由于清單6中的第一個TextBox控件不包含SkinID屬性,是以其外觀為預設外觀。第二個TextBox控件的外觀為BlueTextBox外觀,最後一個TextBox控件的外觀為RedTextBox外觀(請參見圖3)。

圖3:應用預設外觀和命名外觀

傳回頁首

将主題應用于整個應用程式

到目前為止,我們已經通過使用“頁面”指令的主題屬性将多個主題應用于了各個頁面。如果需要,您可以在Web配置檔案中将某個主題應用于整個應用程式。

例如,清單7中的Web配置檔案将OrangeTheme主題應用于了應用程式中的每個頁面。

清單7:Web.Config

<configuration><system.web><pagestheme="OrangeTheme"/></system.web></configuration>

清單7中的Web.Config檔案将把OrangeTheme主題應用于尚未在“頁面”指令中指定主題的所有頁面。換句話說,“頁面”指令能夠替代Web.Config檔案中所指定的任何主題。

同一應用程式可以包含用于指定主題的多個Web.Config檔案。您可以将不同的Web配置檔案添加到不同的子檔案夾中,每個Web配置檔案都可以指定不同的主題。

傳回頁首

主題與StyleSheetTheme

将主題應用于頁面時,主題中所設定的任何控件屬性都優先于頁面中所設定的任何屬性。例如,如果主題指定所有TextBox控件的背景都應當顯示為橙色,那麼即使個别TextBox控件的BackColor屬性具有不同的值,頁面中所有TextBox控件的背景也仍然都将顯示為橙色。

但是,在某些情況下,您會希望替代頁面中的特定外觀設定。例如,當頁面中存在多個TextBox控件時,您可能會希望将某個TextBox控件的BackColor更改為紅色,以便突出顯示該控件。在這種情況下,您就需要利用StyleSheetTheme。StyleSheetTheme的工作方式與普通主題非常相似,隻不過它可以被個别控件的屬性所替代。

與普通主題相比,StyleSheetTheme的工作方式與級聯樣式表更為相似。您可以将級聯樣式表規則替代為指定給個别HTML标記的樣式規則,使用相同的方式也可以将StyleSheetTheme屬性設定替代為個别控件的屬性設定。

例如,清單8中的Skin檔案包含一個TextBox外觀,該外觀将每個TextBox控件的BackColor設定為了橙色,将ForeColor設定為了綠色。

清單8:TextBox.Skin

<asp:TextBoxBackColor="Orange"ForeColor="Green"Runat="Server"/>

假設将清單8中的外觀添加到了OrangeTheme主題中。清單9中的頁面将使用StyleSheetTheme屬性而不是theme屬性來應用該外觀。

清單9:StyleSheetThemedTextBox.aspx

<%@PageStyleSheetTheme="OrangeTheme"%><html><headrunat="server"><title>StyleSheetThemedTextBox</title></head><body><formid="form1"runat="server"><b>FirstName:</b><asp:TextBoxID="txtFirstName"Runat="Server"/><br/><br/><b>LastName:</b><asp:TextBoxID="txtLastName"BackColor="Yellow"Runat="Server"/><br/><br/><asp:ButtonText="Submit"Runat="Server"/></form></body></html>

當您打開清單9中的頁面時,第一個TextBox控件的BackColor将顯示為橙色,而第二個TextBox控件的BackColor将顯示為黃色(請參見圖4)。第一個TextBox控件的BackColor是由顯示在“頁面”指令中的StyleSheetTheme屬性設定的。第二個TextBox控件的BackColor屬性值是由頁面本身設定的。

圖4:使用StyleSheetTheme

轉載于:https://www.cnblogs.com/jaryup/archive/2012/04/10/2440154.html