Window XP的样式终于被可爱的M$搬到ASP.NET中了。这样的东西让我想到了M$的恐怖的想法,原先150智商现在被分解了,150智商=微软解决方案+50智商+已经学会了容忍不完美和失误。当然,如果您的智商已经是150的LEVEL,那么使用微软解决方案可能会导致溢出。(不在讨论范围之内)
其实用样式和主题这样的词并不能很好的说明ASP.NET 2.0中出现的这些东西。因为它很容易和我们的网页样式表css混淆起来。实际上,可以在主题和皮肤中可以定义的绝不仅仅是CSS样式而已。QuickStart中称之为服务器的端的样式,这样会更合适一点。在主题和皮肤中,绝大部分的内容都是可以使用定义的,当然不包括Id。
所有的主题和皮肤都必须放在一个叫App_Themes的目录下,这个目录可以是应用程序级的(把它放在你的站点目录下)或者是全局的(放在.net的目录下,或者放在IIS的一个目录下,具体参见帮助)。主题实际上就是多个皮肤的集合,在App_Themes下的子目录名就是主题名。而主题名下的后缀名为.skin的文件就是皮肤文件。
皮肤文件的写法更是傻瓜式的,其实就是把原先写在控件下的属性移至.skin下。写法和.aspx文件基本上是一样的,只不过没有Id属性,却多了一个SkinId的属性。不用怀疑,在页面中使用同样的SkinId就可以使用这个皮肤定义的样式了。而在皮肤文件中没有使用SkinId属性的控件,将是默认应用到页面中所有没有指定SkinId的同类控件上。
不好意思,忘记了说在Page指令或者程序代码中要显示指定Theme属性,属性的取值就是App_Themes下子文件夹的名字。另外还有一个StyleSheetTheme属性,也是同样的取值范围。晕乎哉?传说Theme属性>页面中指定的属性>StyleSheetTheme属性中指定的属性。但是例子中上述说法很明显是成立的。
不知道大叔大婶姐姐哥哥们有没有考虑过,在一个站点中出现N次男、女这类的下拉框时该怎么办?在每个页面写它的ListItem吗?绑定数据库或XML?漫漫的人生就在这样的思考中消失?如果是这样的话,那么你应该开始喜欢上皮肤了,您可以把你的简单的数据选择框的内容放到皮肤文件里去了。
在皮肤文件中甚至可以出现数据绑定表达式!当然这个是很有限的,仅在数据显示控件,如DataList,DataGrid,Repeater,GridView等(VS2005工具栏中它们被放置在一个单独的组里)。并且必须使用新的Eval或Bind表达式,并且不能在皮肤里执行绑定。
在皮肤文件中也可以使用CSS或者图片等资源,不用担心路径问题,M$已经帮我们解决了,当然,CSS使用起来得小心了,因为它可以影响到全局。
最后,如果要在整个站点使用同一个主题的话,那么在Web.Config中指定吧。在System.Web下增加这样的东东<pages theme="ExampleTheme"/>