15.3 定义多个皮肤选项

把每个控件锁定于某个单一格式有利于标准化,不过对于实际的应用程序而言,这可能就不够灵活了。例如,根据文本框出现的位置以及它们包容的数据,可能需要几种不同的文本框;而对于标签,当它们用做标题或者正文文字的时候,可能差异更大。这时,就需要在主题的皮肤文件中对控件进行多种方式的定义。

一般而言,如果为同一个控件创建了不止一个主题,那么ASP.NET会给出一个编译错误,提示每个控件只可以有一个默认外观。要解决这个问题,需要通过在控件里指定SkinID属性来创建一个被命名的皮肤。下面的示例演示了如何在皮肤文件中创建TextBox控件的多个版本,项目结构如图15-13所示。

figure_0527_0412

图 15-13 多个版本的TextBox控件示例

创建好项目之后,接下来继续来看TextBoxSkin.skin文件。为了能够更好地演示多版本的皮肤创建和使用方法,在TextBoxSkin.skin文件里面创建三种样式的TextBox控件,如代码清单15-8所示。

代码清单15-8 TextBoxSkin.skin


<%——Textbox默认的皮肤定义——%>

<asp:Textbox runat="server"ForeColor="#004000"

Font-Names="Verdana"Font-Size="X-Small"

BorderStyle="Solid"BorderWidth="1px"

BorderColor="#004000"Font-Bold="True"/>

<%——Textbox的TextboxDotted皮肤定义——%>

<asp:Textbox runat="server"ForeColor="#000000"

Font-Names="Verdana"Font-Size="X-Small"

BorderStyle="Dotted"BorderWidth="5px"

BorderColor="#000000"Font-Bold="False"

SkinID="TextboxDotted"/>

<%——Textbox的TextboxDashed皮肤定义——%>

<asp:Textbox runat="server"ForeColor="#000000"

Font-Names="Arial"Font-Size="X-Large"

BorderStyle="Dashed"BorderWidth="3px"

BorderColor="#000000"Font-Bold="False"

SkinID="TextboxDashed"/>


值得注意的是,第一个TextBox控件定义里面没有使用SkinID属性。之所以不使用SkinID属性,是因为这里将它设置成一个默认的样式定义,用于使用这个主题的页面上的所有没有指向SkinID属性的TextBox控件。而第二、三个TextBox控件定义里面都定义了SkinID属性,这样定义之后,只有页面的TextBox控件使用SkinID属性来指定皮肤文件里的SkinID属性的值才能够引用它们。示例如代码清单15-9所示。

代码清单15-9 Test.aspx


<%@Page Language="C#"AutoEventWireup="true"

CodeBehind="Test.aspx.cs"Inherits="_15_4.Test"

Theme="MyTextBox"%>

<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title></title>

</head>

<body>

<form id="form1"runat="server">

<div>

<p>

默认皮肤:

<asp:TextBox ID="TextBox1"runat="server">

</asp:TextBox>

</p>

<p>

TextboxDashed:

<asp:TextBox ID="TextBox2"runat="server"

SkinID="TextboxDashed">

</asp:TextBox>

</p>

<p>

TextboxDotted:

<asp:TextBox ID="TextBox3"runat="server"

SkinID="TextboxDotted">

</asp:TextBox>

</p>

</div>

</form>

</body>

</html>


在代码清单15-9中,TextBox1控件使用了皮肤里的默认定义,TextBox2控件通过SkinID="TextboxDashed"使用了皮肤里的TextboxDashed定义,TextBox3控件通过SkinID="TextboxDotted"使用了皮肤里的TextboxDotted定义。运行页面,结果如图15-14所示。

figure_0528_0413

图 15-14 Test.aspx页面运行结果

最后需要说明的是,在皮肤文件中,SkinID不必保持唯一,它只要对每个控件保持唯一即可。例如,假设要创建一组备用的控件皮肤,它们使用较小的字体。这些控件和所有的主体匹配,但对于显示大量信息的页面它们特别有用。这种情况下,可以创建新的Button、TextBox以及Label控件,并给它们相同的外观名称(如Smaller)。