如何把主题应用于页面以及主题如何在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中重写的方法。

posted @ 2011-06-01 16:24  俗雅冰山  阅读(1019)  评论(0编辑  收藏  举报