列表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