可以用几种声明或编程的方式把主题应用于页面,应用主题最简单的声明方式是在<%@ 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中重写的方法。
|