ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

主题就是允许你为页面和控件定义外观的属性设定集,它负责完成对 Web 应用程序的页面、整个 Web 应用程序、或者服务器上的所有 Web 应用程序的外观应用。

主题和控件的皮肤

主题由一个元素集组成:皮肤、层叠式样式表单(CSS)、图片、以及其他资源。一个主题在最小范围内至少包含有皮肤定义。主题文件被保存在网站或 Web 服务器的特定目录中。

皮肤

皮肤文件是拥有文件扩展名 .skin 并且包含控件类型(如 ButtonLabelTextBox、或者 Calendar 控件)的属性设定集。控件的皮肤设定集有点像控件的标记,只是皮肤设定集中只包含有作为主题的一部分而被设定的属性集。例如,如下实例是为 Button 控件定义的一个控件皮肤:

<asp:button runat="server" BackColor="lightblue" ForeColor="black" />

你可以在主题目录中创建 .skin 文件。一个 .skin 文件可以为一种或多种类型的控件包含一个或多个皮肤。你既可以把每个控件的皮肤分别定义到不同的文件中,也可以在单个文件中定义主题中的所有皮肤。

控件的皮肤有两种类型:默认的皮肤和指定的皮肤:

  • 在主题被应用到页面的时候,默认的皮肤会自动应用到所有类型相同的控件。如果控件中没有指定 SkinID 参数,那么它将使用默认的皮肤。例如,如果你为 Calendar 控件创建了一个默认的皮肤,那么该皮肤会在使用该主题的页面中应用到所有的 Calendar 控件。(默认的皮肤会与与控件的类型完成正确的匹配,所以 Button 控件的皮肤只会应用于所有的 Button 控件,而不是 LinkButton 控件或者是其他的 Button 派生控件。)

  • 指定的皮肤应用于设置了 SkinID 属性的控件。指定的控件不会通过控件的类型而自动被应用。而是,你需要显式地设置控件的 SkinID 属性来完成对控件皮肤的应用。创建指定的皮肤允许你在应用程序中为相同控件的不同实例设置不同的皮肤。

层叠式样式表单

主题中也可以包括层叠式样式表单(.css 文件)。当你把一个 .css 文件保存到主题目录中的时候,该样式表单会自动作为主题的一部分被得到应用。你可以在主题目录中使用扩展名为 .css 的文件来定义样式表单。

主题的图形和其他资源

主题中也可以包括图形和其他资源(如脚本文件或者声音文件)。例如,页面的主题中可能包括一个用于 TreeView 控件的皮肤。作为主题的一部分,你可以在其中包括有用于呈现展开和收缩按钮的图形。

通常,主题中的资源文件与主题的皮肤文件都位于相同的目录中,但是它们也可以位于 Web 应用程序的其他位置(例如主题目录的子目录)。要在主题目录的子目录中引用资源文件,请使用如下实例的 Image 控件皮肤的路径:

<asp:Image runat="server" ImageUrl="ThemeSubfolder/filename.ext" />

你也可以把你的资源文件保存到主题目录之外的位置。如果你使用了波浪号(~)语法来引用资源文件,Web 应用程序将会自动查找图片的位置。例如,如果你把主题的资源保存到应用程序的子目录中,你可以使用如下实例的路径来引用资源文件。

<asp:Image runat="server" ImageUrl="~/AppSubfolder/filename.ext" />

主题的作用范围

你可以为单个 Web 应用程序定义主题,或者为 Web 服务器中的所有应用程序定义全局性的主题。在主题被定义之后,就可以通过使用 @ Page 指令的 ThemeStyleSheetTheme 参数放置到单独的页面中,或者通过设置应用程序配置文件中的 <pages> 元素应用到应用程序中的所有页面。如果 <pages> 元素被定义在 Machine.config 文件中,那么主题将会应用到服务器所有 Web 应用程序中的任何一个页面。

页面主题

页面主题就是在网站 \App_Themes 目录下的一个子目录,该子目录中包括有控件皮肤、样式表单、图形文件以及其他各种资源,每个子目录都各不相同。如下实例中显示了一个典型的页面主题,并定义了两个主题 BlueThemePinkTheme

MyWebSite
  App_Themes
    BlueTheme
      Controls.skin
      BlueTheme.css
    PinkTheme
      Controls.skin
      PinkTheme.css
全局主题

全局主题可以被应用到服务器中的所有网站。如果你在同一个服务器上维护着多个网站,那么就可以使用全局主题统一所有网站的外观。

全局主题与页面主题一样,也包括有属性的设定集、样式表单设定集、以及图形集。区别就是,全局主题是被保存在 Web 服务器的全局 \Themes 目录中的。服务器上的任何一个网站、以及任何一个网站中的任何一个页面,都可以引用全局主题。更多关于创建全局主题目录的信息,请参考“ASP.NET 实践:定义 ASP.NET 主题”。

主题设定的优先序列

你可以指定主题设定集的优先序列,并指定主题被应用的方式以接管控件中的局部设定。

如果你设置了页面的 Theme 参数,那么主题中的控件设定集和页面会被合并成最终的控件设定集。如果控件的设定在控件和主题中同时被定义,那么主题中的控件设定集会重载控件中的任何一个页面设定集。这个策略允许主题创建跨页面的一致外观,就算页面中的控件已经拥有单独的属性设定集时也是这样。例如,它允许你把主题应用到较早版本中的 ASP.NET 页面。

另外,你可以使用页面的 StyleSheetTheme 属性把主题当作样式表单主题来应用。在这种情况下,如果两个位置同时定义了相同的设定,那么局部页面的设定集将拥有比其他位置的主题定义中更高的优先序列。这就是层叠式样式表单所使用的模型。在应用一致的外观主题的时候,如果你需要在页面中设置单独的控件属性集,那么你就可以把主题当作样式表单琮应用。

通过使用主题而定义的属性集

作为一种规则,你可以使用主题来定义页面、控件外观、或静态内容的相关属性集。你可以只为 ThemeableAttribute 参数被设置成 true 的控件类设置那些属性集。

明确地指定控件的行为属性集而不是接受来自于主题的设定值。例如,你不能使用主题设置 Button 控件的 CommandName 属性值。类似地,你也不能使用主题来设置 GridView 控件的 AllowPaging 属性或 DataSource 属性的值。

主题 VS 层叠式样式表单

主题与层叠式样式表单的相同之处就是都定义了能够被应用到任何页面的公共参数集。但是,主题与样式表单之间还是存在如下区别:

  • 主题可以为控件或页面定义许多属性集,而不单只是样式属性集。例如,使用主题,你可以指定 TreeView 控件的图形、GridView 控件的模板布局,等等。

  • 主题中可以包括图形。

  • 主题不像样式表单那样是层叠的。例如,默认时,属性值会重载局部的属性值,除非你明确地把主题当作样式表单主题来应用。

  • 只有一个主题可以被应用到每一个页面。你不能够为一个页面应用多个主题,而样式表单不同,多个样式表单可以同时被应用到同一个页面。

posted on 2006-12-28 12:55  Laeb  阅读(1412)  评论(0编辑  收藏  举报