发新话题
打印

asp.net2.0 中的皮肤

asp.net2.0 中的皮肤

(一) 如何使用

1) 在你的应用里面添加 App_Themes 文件夹

2) 将主题相关的文件(包括.css,、.skin文件、其他资源文件包括图片、Flash等)组织到一个以主题名命名的文件夹中,将主题文件夹放于App_Themes目录。如果有多个主题,重复上述步骤。

Example : Css 文件(x.css) Skin 文件(x.skin) .column {}{background-image: url(images/content-shim.gif);} .gradient {}{ background-image: url(images/content-shim-photo.gif);} .solid {}{background-image: url(images/content-shim-none.gif);} .header {}{ background-image: url(Images/header.gif); background-repeat: no-repeat; position: relative; width: 789px; height: 76px; margin: 0 auto 5px auto; }

理论上上来说,不同的主题中的样式表和SKIN文件的结构都应该是完全相同的。

3) 设置你要应用主题的控件的css样式名为css中定义的样式名(比如column、gradient)设置你要应用主题的服务器控件的SkinId为Skin文件中定义的skinid(比如login、create等),这样在Skin中定义的控件属性会自动附加到当前的控件上(内部也是使用CSS实现的)

4) 应用主题,有三种办法

全局主题:在Web.config中中添加节,这样在整个应用中都会自动应用名为ThemeName 的主题

页面主题:在ASPX文件顶部加入:<%@ Page Language="C#" StylesheetTheme=" ThemeName " %>,这样当前页面都会应用名为ThemeName 的主题,或者在ASPX_CS中加(Page_Load方法)入如下代码 Page. StyleSheetTheme = “ThemeName”;

角色主题:需要使用masterpage 来辅助实现 ,通过User.IsInRole(“RoleName”) 来判断用户是否属于某个角色,然后决定使用何种主题(Page. StyleSheetTheme = “ThemeName”);当然,使用这种办法还可以应用用户选择的主题

 

(二) 工作原理 不同的主题和皮肤之间的不同主要是页面和页面中的控件的样式(包括字体、段落、背景、边框等等)、部分图片的不同。 传统的完全使用CSS来表现不同的主题的方案,在处理图片和图片按钮的地方往往心有余而力不足。而在aspnet2.0里面一切都已经变得简单。 主题和皮肤是 dotnet framework2.0内建支持的,服务器控件添加了SkinId属性,Page类也添加了Theme 和 StyleSheetTheme 属性,其目的就是优雅的支持Skin。在应用指定了主题之后,相关的页面会自动链接位于主题目录下的css文件和skin文件,css的用法跟传统的用法没有什么区别,而skin文件则以一种类似于css的方式工作,指定了SkinId的服务器控件会自动从skin文件中加载并附加匹配的属性或样式(最常用的是Image 和ImageButton的ImageUrl属性,这样做可以使页面在不同的主题下)---这是在服务器端完成的。由于skin文件在使用后是缓存在内存中的,所以效率不会有问题。

 

(三) Theme 和 StylesheetTheme 的区别 stylesheettheme 和 theme属性可以同时应用,起应用方法基本都是一样的,只是执行的优先级不同   

1、如果页面单独使用stylesheettheme属性指定主题,那么内容页内定义的控件属性将覆盖sylesheettheme定义的控件属性  

2、如果页面单独使用theme属性,那么只执行theme属性所定义的主题,内容页内定义的属性将不起作用3、如果页面内同时定义stylesheettheme和theme属性指定主题,那么优先级是stylesheettheme >>内容页内定义的属性>>然后才是theme 在SkinFile(SkinFile.skin)可以建 StyleSheet.css 引用 Theme="SkinFile" 就可以用到

   StyleSheet.css中的样式,另一种方法

<head runat="server">
     <link rel="stylesheet" href="App_Themes/StyleSheet.css" type="text/css" />
</head>
          

(四) 优雅之处 a) 完全Framework内建的支持、不再需要复杂的编程,甚至不再需要编程; b) 在vs2005中有非常友好的设计时支持,也就是说,在设计的时候你就可以看到某种主题的效果; c) 学习曲线很平缓,如果你熟悉CSS的话,则更加没有难度。

(五) 代码 换肤

protected void Page_PreInit(object sender, EventArgs e) {

 string thm; thm = (string)Session["themeSelected"];

 if (thm != null) { Page.Theme = thm; DropDownList1.Text = thm;

}

else

 {

 Session["themeSelected"] = DropDownList1.Text;

Page.Theme = "Blue";

}

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) {

Session["themeSelected"] = DropDownList1.Text; Server.Transfer(Request.FilePath);

}

[ 本帖最后由 小红马 于 2008-8-8 15:14 编辑 ]

TOP

可能有些朋友还不是很清楚themes、skins。下面先介绍下themes、skins.。
一、简介:
一看Themes、Skins这2名字就都知道是用来做什么的了吧,下面就说下它是做什么的(怎么都知道了还说,~_~),利用Themes我们可以很容易的更改控件、页面的风格,而不需要修改我们的代码和页面文件。
Themes文件被单独的放在1个App_Themes文件夹下面,与你的程序是完全分开的。
二、怎么使用Themes和Skins:
先看个非常简单的实例:
App_Themes\default\1.skin文件代码:
<asp   src="http://www.chinamdj.com/images/smilies/default/sweat.gif" border=0 smilieid="10">abel 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>  src="http://www.chinamdj.com/images/smilies/default/titter.gif" border=0 smilieid="9">age with Example Theme Applied</title>
</head>
<body>
  <form id="form1" runat="server">
      <asp   src="http://www.chinamdj.com/images/smilies/default/sweat.gif" border=0 smilieid="10">abel ID="Label1" runat="server" Text="Hello 1" /><br />
      <asp   src="http://www.chinamdj.com/images/smilies/default/sweat.gif" border=0 smilieid="10">abel 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>   src="http://www.chinamdj.com/images/smilies/default/titter.gif" border=0 smilieid="9">age with Example Theme Applied</title>
</head>
<body>
  <form id="form1" runat="server">
      <asp   src="http://www.chinamdj.com/images/smilies/default/sweat.gif" border=0 smilieid="10">abel ID="Label2" runat="server" Text="Hello 2" SkinID="Blue" /><br />
      <asp   src="http://www.chinamdj.com/images/smilies/default/sweat.gif" border=0 smilieid="10">abel 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
<aspLabel 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了。

[ 本帖最后由 小红马 于 2008-8-8 18:29 编辑 ]

TOP

发新话题