如何把主题应用于页面以及主题如何在ASP.NET中的另一个特殊目录下定义?

可以用几种声明或编程的方式把主题应用于页面,应用主题最简单的声明方式是在<%@ Page %>指令中使用Theme或StyleSheetTheme属性:

<%@ Page Theme="myTheme" ... %>

或者:

<%@ Page StyleSheetTheme="myTheme" ... %>

国外服务器租用商提醒您其中,myTheme是给主题定义的名称。

另外,还可以在Web站点的Web.config文件中使用一项,给该站点上的所有页面指定要使用的主题:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

<system.web>

<pages Theme="myTheme" />

</system.web>

</configuration>

这里也可以使用Theme或StyleSheetTheme属性。还可以使用<location>元素重写某个页面或目录的这个设置,

其方式与上一节中给安全信息使用该元素的方式相同。

如果采用编程方式,可以在页面的后台代码文件中应用主题,但只能在Page_PreInit()事件处理程序中应用主题,

该事件在页面生存期的早期触发。在这个事件中,只需把Page.Theme或Page.StyleSheetTheme属性设置为要应用的主题名即可,

通过代码应用主题时,可以动态应用一组主题中的一个主题文件。这个技巧将在PCSDemoSite中使用,如后面所示。

38.5.2 接下来香港服务器租用商介绍如何定义主题

主题在ASP.NET中的另一个特殊目录下定义,在这里是App_Themes。App_Themes目录可以包含任意多个子目录,

每个子目录下有一个主题,子目录名就是主题名。

定义主题时,需要把主题的所有必要文件放在主题子目录下。对于CSS样式表,不需要考虑文件名,主题系统会自

动查找扩展名为.css的文件。同样,.skin文件也可以有任意文件名,但最好使用多个.skin文件,每个.skin文件用

于要设置样式的一个控件类型,每个.skin文件的名称都用该控件名指定。

Skin文件包含服务器控件的定义,其格式与标准ASP.NET页面中使用的格式相同。其区别是skin文件中的控件不会添

加到页面上,它们只用于提取属性。按钮样式的定义一般放在Button.skin文件中,其内容如下所示:

<asp:Button Runat="server" BackColor="#444499" BorderColor="#000000"

ForeColor="#ccccff" />

这个文件实际上是从PCSDemoSite的DefaultTheme主题中提取的,负责设置本章前面Meeting Room Booker页面中的按钮外观。

以这种方式为控件类型创建skin文件时,不需要使用ID属性。

38.5.3 接下来美国服务器租用商讲解PCSDemoSite中的主题

Web站点PCSDemoSite包含3个主题,可以在/Configuration/Themes/Default.aspx页面上选择这3个主题--只要登录

为RegisteredUser或SiteAdministrator角色的一个成员即可。这个页面如图38-15所示。

这里使用的主题是DefaultTheme,也可以在这个页面上选择其他主题,图38-16显示了BareTheme主题。

这个主题适合于Web页面的可打印版本。BareTheme目录并不包含文件,这里使用的文件是根样式表StyleSheet.css。

图38-17显示了LuridTheme主题。

这个主题的颜色非常鲜亮,但很难阅读,它说明了站点的外观可以使用主题动态改变。更重要的是,像这样的主题可以提供Web站点的高对比度或大文本版本,以便于访问。

在PCSDemoSite上,当前选择的主题存储在会话状态中,所以在站点上浏览时,主题会保持不变。/Configuration/Themes/Default.aspx的后台代码文件如下所示:

public partial class _Default : MyPageBase

{

private void ApplyTheme(string themeName)

{

if (Session["SessionTheme"] != null)

{

Session.Remove("SessionTheme");

}

Session.Add("SessionTheme", themeName);

Response.Redirect("~/Configuration/Themes", true);

}

void applyDefaultTheme_Click(object sender, EventArgs e)

{

ApplyTheme("DefaultTheme");

}

void applyBareTheme_Click(object sender, EventArgs e)

{

ApplyTheme("BareTheme");

}

void applyLuridTheme_Click(object sender, EventArgs e)

{

ApplyTheme("LuridTheme");

}

}

这里的关键功能在ApplyTheme()中,它使用键SessionTheme把所选主题的名称放在会话状态中,并确定会话状态中是否已有一个主题,如果是,就删除它。

如前所述,主题必须在Page_PreInit()事件处理程序中应用,国外服务器租用商提醒您不能在所有页面使用的master页面中访问它,

所以,如果要把选中的主题应用于所有的页面,有两个选项:

● 在所有要应用主题的页面中,重写Page_PreInit()事件处理程序

● 为所有要应用主题的页面提供一个公共基类,再重写这个基类中的Page_PreInit()事件处理程序

PCSDemoSite使用第二个选项,在Code/MyPageBase.cs中提供了一个公共页面基类:

public class MyPageBase : Page

{

protected override void OnPreInit(EventArgs e)

{

// theming

if (Session["SessionTheme"] != null)

{

Page.Theme = Session["SessionTheme"] as string;

}

else

{

Page.Theme = "DefaultTheme";

}

// base call

base.OnPreInit(e);

}

}

这个事件处理程序检查SessionTheme中条目的会话状态,如果会话状态中有一项,就应用选中的主题,否则就使用DefaultTheme。

注意这个类继承了通用的页面基类Page,这是必需的,否则页面就不能执行为一个ASP.NET Web页面。

为了使程序正常工作,还要为所有的Web页面指定这个基类。这有几种方式,最简单的方式是在页面的<@ Page %>指

令或后台代码文件中指定。前者适合于简单的页面,但页面不能使用定制的后台代码文件,因为页面在其定制的后台代

码文件中不再使用<@ Page %>指令。另一种方式是修改页面在后台代码文件中继承的类。在默认情况下,

新页面继承了Page,但可以改变这个继承。在前面主题选择页面的后台代码文件中,注意有如下代码:

public partial class _Default : MyPageBase

{

...

}

这里把MyPageBase指定为 Default类的基类,所以使用在MyPageBase.cs中重写的方法。