Bear.sTaR{R}

花开有时,错过了一日便错过了一季,就象人生错过了相遇,就不再找寻到美丽的相聚

ASP.NET2.0中themes、Skins轻松实现网站换肤!

可能有些朋友还不是很清楚themes、skins。下面先介绍下themes、skins.。

一、简介:
一看Themes、Skins这2名字就都知道是用来做什么的了吧,下面就说下它是做什么的(怎么都知道了还说,~_~),利用Themes我们可以很容易的更改控件、页面的风格,而不需要修改我们的代码和页面文件。
Themes文件被单独的放在1个App_Themes文件夹下面,与你的程序是完全分开的。

二、怎么使用Themes和Skins:
先看个非常简单的实例:

App_Themes\default\1.skin文件代码:

<asp:Label Font-Bold="true" ForeColor="Red" runat="server" />

default.aspx:文件代码:

<%@ Page Language="C#" Theme="default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  
<title>Page with Example Theme Applied</title>
</head>
<body>
  
<form id="form1" runat="server">
      
<asp:Label ID="Label1" runat="server" Text="Hello 1" /><br />
      
<asp:Label ID="Label2" runat="server" Text="Hello 2" /><br />
  
</form>
</body>
</html>

可以看到我们在default.aspx并没有写如何的控制style的代码,但运行取发现label上的字都变成了粗体红色了,这就是1个最基本的theme例子。

App_Themes文件夹:
App_Themes文件夹位于程序的根目录下,App_Themes下必须是Theme名称的子文件夹,子文件夹中可以包含多个.skin和.css文件。下图中建立2个Theme,名称分别为default和default2:


使用themes
1、在1个页面中应用Theme:
      如果想在某1个页面中应用Theme,直接在aspx文件中修改<%@ Page Theme="..." %>,比如你想这个页面应用default2 theme,设置<%@ Page Theme="default2" %>就OK

2、在所有页面应用同1个Theme:
      如果要在所有页面上使用相同的Theme,在web.config中的<system.web>节点下加上句<pages theme="..."/>

3、让控件不应用Theme:
        第1个例子中我们看到了2个Label的风格都变了,就是说.skin文件中的风格在页面上所有Label都起作用了。但有时我们希望某1个Label不应用.skin中的风格,这时你只需设置Label的EnableTheming属性为false的时候就可以了。
        也许你还想不同的label显示不同的风格,你只需设置label的SkinID属性就可以,见下面的实例:
 App_Themes\default\1.skin

<asp:label runat="server" font-bold="true" forecolor="Red" />
<asp:label runat="server" SkinID="Blue" font-bold="true" forecolor="blue" />

deafult.aspx

<%@ Page Language="C#" Theme="default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  
<title>Page with Example Theme Applied</title>
</head>
<body>
  
<form id="form1" runat="server">
      
<asp:Label ID="Label2" runat="server" Text="Hello 2" SkinID="Blue" /><br />
      
<asp:Label ID="Label3" runat="server" Text="Hello 3" /><br />
  
</form>
</body>
</html>

运行后就会发现2个label显示的风格不一样了。

4、其他方法:
前面已经说了在aspx文件头使用 <%@ Page Theme="..." %> 来使用theme,而用这个方法应用theme中的风格将会覆盖你写在aspx中的控件属性style。比如:
 App_Themes\default\1.skin

<asp:Label Font-Bold="true" ForeColor="Red" runat="server" />

default.aspx

<%@ Page Language="C#" Theme="default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
</head>
<body>
  
<form id="form1" runat="server">
      
<asp:Label ID="Label1" runat="server" Text="Hello 1" /><br />
      
<asp:Label ID="Label2" runat="server" Text="Hello 2" ForeColor="blue" />
  
</form>
</body>
</html>

运行结果,所有的label的forecolor都为red。

 而使用<%@ Page StyleSheetTheme="..." %>应用theme就不会覆盖你在aspx文件中写的属性style:

控件应用style属性的顺序如下:
a、StyleSheetTheme引用的风格
b、代码设定的控件属性(覆盖StyleSheetTheme)
c、Theme引用的风格(覆盖前面2个)

theme中包含CSS:
        theme中也可以使用.css文件,当你把.css文件放在1个theme目录下后,在用到了这个theme的页面中自动会应用你的.css的

三、后台代码轻松为网站换府肤
        前面讲的都是在aspx文件或web.config中应用theme,而在blog这样的每个用户都有不同的skin的网站中用上面的方法来实现换skin显然是不方便的。
       下面就介绍怎么在后台代码中动态的引用theme来解决上面的情况,theme必须在page被请求的最早期就应用上,所以我们必须在Page_PreInit事件中写代码,代码很简单,就1句:
        Page.Theme = "..."; 
这里我们只要从数据库中去读取每个用户设置的不同theme名就可以轻松实现每个用户都有不同的skin了。

------------------------------------------
以上都是个人的看法和体会,如有不妥处,还请大家多多指点,谢谢!

posted on 2006-04-10 20:26 Bear.sTaR{R} 阅读(5547) 评论(13)  编辑 收藏 网摘 所属分类: WEBASP.NET 2.0

Feedback

#1楼  2006-04-10 21:48 Dflying Chen      

Skin与Theme确实是一个好方法,但是我觉得对于复杂的版式变换还是力不从心。它们仅仅能够定义一些控件,组件的外观。而对于组件的位置却很难实现控制。
比如对于blogcn来讲,我如果需要将日历和分类的显示顺序调换一下,或者我想把两栏的布局改称三栏,则必须修改ASPX文件。(当然也可以通过Skin与Theme中绝对定位的CSS来实现,但对于再复杂一些的排版问题同样会有无能为力的时候。)同时使用Skin与Theme也会带来一定的性能开销。
所以,我个人认为,Skin与Theme将会有一些用途,但是传统的更换CSS文件也就足够了,ASP.NET 2.0中引入的Skin与Theme并没有太大的新意。
欢迎探讨。   回复  引用  查看    

#2楼  2006-04-10 22:00 ha [未注册用户]

“没有太大的新意“??其实还是有很大新意的,比如说可以预先设定控件的属性,可以包含css,image和其他一些资源文件,只是它的不可层叠确实不很方便。如果再结合MasterPage,作用会很大。   回复  引用    

#3楼  2006-04-10 22:12 cp      

同意ha的说法,新意还是有一些的,资源文件一直是网络应用程序难以管理的一个方面。那么themes skins可以起到一定的作用,呵呵,当然只是个人的看法。楼主还是说得蛮详细的,留个脚印。   回复  引用  查看    

#4楼  2006-04-10 22:51 Dflying Chen      

@ha
@cp
恩,是的,确实有一些作用。
虽然引用了skin,theme以及master page等概念确实使表示层的开发有了一些OO的意思,但我的意思是这些OO还不够,还不能完全满足需要。就我上面提到的几个要求,恐怕是skin,theme以及master page等概念无法解决的吧,还是需要准备不同的ASPX文件。
我再考虑的是能否有一种比较“完美”的解决方案。当然,也仅仅是我个人的看法。各位见笑了。   回复  引用  查看    

#5楼 [楼主] 2006-04-10 23:02 Bear.sTaR{R}      

@Dflying Chen
我如果需要将日历和分类的显示顺序调换一下:这个到可以通过使用修改masterpage来实现.
至于你说的两栏的布局改称三栏:这个改动比较大,等于网页的整个整体布局都变了,这样的变化可能也没什么特别方便的办法!!!
---------------
个人看法too   回复  引用  查看    

#6楼  2006-04-10 23:49 titi      

其实我的理解来说asp.net2 默认的解决方法只是提供了一种解决技术而不是一个换肤方案 具体的皮肤方案还需要我们自己去设计。
Masterpage提供了页面布局级别的ui设定和重构
Theme提供了用户控件和webpart等服务器端结构的布局
Css提供了客户端对样式的组织能力。xhtml+css的缺陷就是布局的灵活性欠缺
所以我利用asp.net2的默认的mp theme结合xhtml+css等要素自己组合了一个皮肤模型。自定义了一个page的基类,然后根据配置文件和个性化定制甚至额外的表达式来决定每个页面具体应该使用的mp theme css js meta等
通过动态控制来获得足够的灵活性 目前模型基本上是可以用了 不过我想做成membership之类的提供默认用户控件和更灵活的定制甚至辅助的皮肤设计器和基于web的皮肤设计器等的一套解决方法。 以后我会把它连同demo一起放出来   回复  引用  查看    

#7楼 [楼主] 2006-04-11 09:10 Bear.sTaR{R}      

@titi
期待你的demo。   回复  引用  查看    

#8楼  2006-04-11 09:17 第一控制.NET      

masterpage+webpart+themes就全ok了。   回复  引用  查看    

#9楼  2006-04-11 17:27 DarkAngle      

去看看我写的这个东西,也是关于换肤的.http://darkangle.cnblogs.com/archive/2006/03/29/361964.html   回复  引用  查看    

#10楼  2006-05-11 13:02 cjk [未注册用户]

写的很全面,不错.   回复  引用    

#11楼  2007-01-11 14:44 饭桶 [未注册用户]

我用了一些自定义的组件,如:xgrid,anthem的组件,这些在themes中根本就不能用。。。。。QQ:2284243
哪位大侠能用的话,告诉我一声。我也用用。。。。。
fred.men@tom.com   回复  引用    

#12楼  2008-07-19 11:20 雪阳 [未注册用户]

请问如何通过编程动态切换皮肤?谢了!   回复  引用    






标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-06-07 15:41 编辑过
Google站内搜索
[推荐职位]上海盛大网络招聘.Net开发工程师

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:
 

My Links

Blog Stats

News

与我联系

搜索

 

常用链接

留言簿(2)

我参与的团队

随笔分类(21)

随笔档案(22)

文章分类(2)

文章档案(4)

MSDN

最新随笔

积分与排名

最新评论

阅读排行榜

评论排行榜