感觉

--------------海阔凭跃,天高任
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ASP.NET 2.0 里的主题(Themes)

Posted on 2005-11-12 20:58  感觉  阅读(181)  评论(0)    收藏  举报

????? 在Visual Web Developer中,最近新发现ASP.NET居然也跑出主题来了。想想在Visual Studio .NET 2003中,统一每个DataGrid的样式、TextBox的BorderStyle等时,得每个页面每个控件设置过去,实在烦得可以。现在有了主题这东西,就象Windows换主题一样简单。此时,再看看其他诸如新增的ImageMap、HiddenField、Pager、Master&Content、SiteMapPath等控件,真的感觉MS在WebForm这块是狠下了工夫了。
????? ASP.NET2.0中主题分为全局主题(Global Themes)和页主题(Page Themes)。所谓全局主题其实就是ASP.NET2.0中预定义的一系列主题,这些主题里都为大多数的控件预先定义了一套样式供ASP.NET WEB应用程序使用。而所谓的页主题,也就是我们为自己的Web应用程序,甚至是单独的页面而自定义的主题。另外,还有控件皮肤(Controls Skins)的概念,注意到ASP.NET2.0中很多控件多了个SkinID属性,也就是换皮肤用的了。控件皮肤也分为Default Skins和Named Skins。当你为Calendar控件创建了一个Default Skins,那么应用包含该Skins的主题时,页面里的所有Calendar控件都将“套上该皮肤”;而Named Skins其实就是拥有一个特别ID的控件皮肤,它就是与控件里的SkinID属性结合做换皮肤用的了。J
??? 换主题其实操作起来很简单:

  • 首先,创建一个ASP.NET Web Site在D:\MyWeb\TestThemes下,然后从工具箱Core选项卡里拉几个Label、Button、GridView到Default.aspx也上。另外,记得看下源代码里的header是否runat=server,应为
    。特别强调下,所有的页主题都必须放在Web应用程序主目录下的Themes文件夹里的某个自定义文件夹里,例如:D:\MyWeb\TestThemes\Themes\MyTheme。主题文件后缀名必须为.skin。
  • 其次,如果是应用全局主题,就直接往Page指令加属性: 其中BasicBlue就是预定义的一套主题。这是单独一个页面的主题应用。如果想让整个WebSite所有页面都应用该主题, 直接在web.config的里加入即可。于是,大部分控件,包括Label、Button和GridView等的样式都变成了以兰色主题。真象Windows主题。
  • 如果是页主题,那就要往第一步的MyTheme目录里加skin文件了。新建一个文本文件,命名为TheThemes.skin,该文件内部定义如下: 好了,类似上面第2步操作,将 BasicBlue 改为MyTheme即可。于是页面里的Label控件都将是上面的样式。

??? 扩展上面的想法,我们完全可以在MyTheme目录里定义自己的一系列Skins,例如GridViews.skin、Buttons.skin等,然后应用主题,总体感觉很清晰也很方便。我弄Skins文件,都是直接先在WebForm页里设置好样式(例如GridView自带里面的样式),然后拷贝里面的样式出来直接粘贴在Skins文件里,最后把控件原有的样式都删除,就可以了。还是需要强调一点,诸如GridView的AllowPaging等非视觉属性的都不能在Skins文件里定义,不然就出错了。

??? 最后,还有个感觉,这里的主题跟CSS真的很象。不过用法却不大一样就是了。J
----------------
谢谢您的分享

由您的文章中看起来 Themes 机制似乎是在 CSS 上头包了一层,让开发者直接设定 ASP.NET 控件外观,再藉由 ASP.NET 的 Themes 机制在底层将之转换成 CSS ,同时也提供了一个 ASP.NET 风格的设定方式让使用者来套用这些 Themes 。

所以开发者可以不会 CSS ,只要会写
<asp:Label runat="server" Font-Names="宋体" Font-Size="14pt" ForeColor="red"></asp:Label>
即可,对于不熟悉 CSS 的开发者来说,这样的设计应该是变得容易许多。同样的,当开发者要套用样式到网页中时,也不需要去弄懂 class 属性如何设定,因为 ASP.NET 底层把这些工作都做掉了。

不知道我这样的看法正确否? :)