ASP.net 学习笔记之主题

关于主题(Theme)

  一个基本约定是,不在母版中设置主题。

主题设置方法

  1、默认方法:刷新程序

  在@Page指令中设置。 

<%@ Page Theme="myFirstTheme" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

 

<%@ Page StyleSheetTheme="myFirstTheme" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>  

  Theme与StyleSheetTheme两者区别是优先级不同:

   加载的顺序是:StyleSheetTheme ----->页面中的样式 -----> Theme .

  最后显示是:取三者合并,同样的定义依次加载,后者(Theme最高)会取代前者。另外,Theme在设计视窗中不会即时显示效果(所见即所得),而StyleSheetTheme则可以。

这种方法的优点是简单,缺点显而易见:维护起来麻烦,如果有1000页的话?如果有多种主题呢?

  2、编程方式:

  i.Theme方法

   页面生命周期中的Page_PreInit事件:Page_PreInit事件是.NET 2.0 Framework中引入的新事件,是在代码中能够访问的第一个事件(它在Page_Load或者Page_Init事件之前激活)。和母版页一样,如果要以编程方式设置主题,那么就必须在Page_PreInit事件中设置它们。

protected void Page_PreInit(object sender, EventArgs e) {

Page.Theme
= "myTheme";

}

 

protected void Page_PreInit(object sender, EventArgs e)

{

if (Page.Request.Browser.Browser == "IE")

{

Page.Theme
= "myFirstTheme";

}

else

{

Page.Theme
= "";

}

}

 

另外有必要指出的是,这种方法允许在项目中使用Theme设置作为自身的标准。例如,可以在Page_Load事件中使用下面的代码将实际设置的主题写入浏览器。

代码
protected void Page_Load(object sender, EventArgs e)

{

if (Page.Theme != "")

{

Response.Write(
"<p>Theme: " + Page.Theme + "</p>");

}

else

{

Response.Write(
"<p>Theme: No Theme Has Been Set</p>");

}

}

 

为什么不在Master中设置主题?因为Master没有Page_PreInit事件

  ii.StyleSheetTheme方法(与Theme的重大区别) 

代码
using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page

{

public override string StyleSheetTheme

{

get

{

if (Page.Request.Browser.Browser == "IE")

{

return "myFirstTheme";

}

else

{

return "";

}

}

set

{

base.StyleSheetTheme = value;

}

}

protected void Page_Load(object sender, EventArgs e)

{

if (Page.StyleSheetTheme != "")

{

Response.Write(
"<p>StyleSheetTheme: " + Page.StyleSheetTheme + "</p>");

}

else

{

Response.Write(
"<p>StyleSheetTheme: No StyleSheetTheme

Has Been Set
</p>");

}

}

}

优点:控制灵活。

缺点:大量代码驻留在每个页面。

如果@Page中与Page_PreInit同时设置Theme,谁会被执行呢?是Page_PreInit!

  3.全局设置主题

i.Web.config 

<system.web>

<pages theme="myFirstTheme"/>

</system.web>

或者

<system.web>

<pages styleSheetTheme="myFirstTheme"/>

</system.web>

  注意:Web.config文件内容区分大小写,如果属性输入StyleSheetTheme(styleSheetTheme)则无效。

  如果Web.config文件/@Page/Page_PreInit同时指定主题,顺序是:

  Web.config-----@Page-----Page_PreInit(由低到高),也就是说,web.config可以全局定义,但是,一样可以为单一文件指定Theme。

ii.machine.config

   web.config只影响单个web应用,如果需要指定特定web服务器上所有web应用,使用machine.config.

  4.继承的基类

混合编程与全局的方法。

建立1个新类,PageBase.cs,写入:

代码
using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

/// <summary>

/// Summary description for PageBase

/// </summary>

public class PageBase : Page

{

protected void Page_PreInit(object sender, EventArgs e)

{

Page.Theme
= "myFirstTheme";

}

}

删除其他位置(@Page,Web.config,Page_PreInit,Machine.config)的指定;

最后,在页面中添加PageBase继承:

public partial class _Default : PageBase

如果使用styleSheetTheme属性替代Theme,类定义代码为:

代码
using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

/// <summary>

/// Summary description for PageBase

/// </summary>

public class PageBase : Page

{

public override string StyleSheetTheme

{

get

{

return "myFirstTheme";

}

set

{

base.StyleSheetTheme = value;

}

}

}

 如果,在此基础上(基于Theme属性)再设一个主题theme2,如何实现?

代码

public partial class _Default : PageBase
{

protected void Page_PreInit(object sender, EventArgs e) {

base.Page_PreInit(sender, e);
Page.Theme
= "theme2";

}

protected void Page_Load(object sender, EventArgs e)
{

}

}

如果不调用base.Page_PreInit(sender,e)则会出错。这说明,使用类的方式,如果两个位置同时调用,则有一个会完全忽略。所以需要首先调用基类中的Page_PreInit事件,然后再运行页面中的代码。

上述代码的另一个问题是,VS代码视图中会出现波浪线(警告),需加new 关键字

 

protected new void Page_PreInit(object sender, EventArgs e)

{

base.Page_PreInit(sender, e);

//Page.Theme = "mySecondTheme";

}

使用StyleSheetTheme没有上述的麻烦

 

摘录自《ASP.NET Web界面设计三剑客:CSS、Themes和Master Pages》

posted @ 2010-03-10 22:44  Partoo  阅读(645)  评论(0编辑  收藏  举报