ASP.NET页面有两个设置主题的不同属性,Themes属性和StyleSheetTheme属性。这两个属性,都是用App_Theme定义的主题,但是StyleSheetTheme属性在页面开始的比较早,Themes属性在页面的生命周期中用的比较晚。
所以,StyleSheetTheme属性能被页面重写,而Theme又能重写这些属性。Theme定义的页面外观就不能再被重写了。
应用主题有三个选项:1.在Page指令中的页面级,
<%@ Page Language="C#" ..... Theme="mySheme" %>
2.在站点级别Web.config文件中通过
添加
<system.web>
<page theme="myTheme" styleSheetTheme="DarkGrey">
......
<pages>
3.通过程序来设置主题。即动态切换主题
在运行时动态切换主题有几个好处,允许用户用喜欢的颜色和布局选择主题,也可以用不同的字体大小,来适应不同的人群。
在母版页中插入 DropDownList控件,增加两个Item,设定不同的主题。
****千万注意,一定要设置该控件的AutoPostBack:true,因为这个我找了两个小时的错误。
然后为DropDownList1_SelectedIndexChanged事件编写动态切换主题的程序
若改变主题选项,则应用新主题,同时储存主题信息。
用cookie储存主题
下面则是改变主题,储存主题信息到cookie,并重新刷新本页面的的代码,
位置是母版页的code behind:
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
HttpCookie preferredTheme = new HttpCookie("PreferredTheme");
preferredTheme.Expires = DateTime.Now.AddMonths(1);
preferredTheme.Value = DropDownList1.SelectedValue;
Response.Cookies.Add(preferredTheme);
Response.Redirect(Request.Url.ToString());
}
网站打开时,需要先读出储存的上次网站退出时存储的页面主题,若不一致,则修改DropDownList选择为储存的主题
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string SelectedTheme = Page.Theme; //保存页面Theme
HttpCookie preferredTheme=Request.Cookies.Get("PreferredTheme");
if (preferredTheme!=null)
{
SelectedTheme=preferredTheme.Value;
}
if (!string.IsNullOrEmpty(SelectedTheme))
{
ListItem item = DropDownList1.Items.FindByValue(SelectedTheme);
if (item != null)
{
item.Selected = true;
}
}
}
}
4.BasePage类中:
private void Page_PreInit(object sender, EventArgs e)
{
HttpCookie preferredTheme = Request.Cookies.Get("PreferredTheme");
if (preferredTheme != null)
{
string folder = Server.MapPath("~/App_Themes/" + preferredTheme.Value);
if (System.IO.Directory.Exists(folder))
{
Page.Theme = preferredTheme.Value;
}
}
}
public BasePage()
{
this.PreRender += Page_PreRender;
this.PreInit += Page_PreInit;
}
5.在浏览器中打开网页,这样就可以动态切换主题了。!!!