4

我的项目有多个不同颜色的主题。
我需要使用特定字体/大小/等对某些文本框进行蒙皮。[无色差]
目前,我添加<asp:TextBox SkinID="skinned" runat="server".../>到每个主题下的所有 .skin 文件中。有没有办法把这个文本框皮肤放在一个地方,就像主皮肤一样?

4

2 回答 2

5

ASP.NET 主题实现中缺少继承或级联是一个不幸的限制,没有引起太多关注。在您希望所有主题都可以使用全局皮肤的情况下(不更改控件定义本身),您有两个选择:

选项 #1:使用 VirtualPathProvider

(这样做的缺点是你不能在没有基于反射的解决方法的情况下在预编译的网站上使用它。)

您可以在保存共享皮肤的特殊全局主题下定义Global.skin文件;您还将在所有其他主题下创建一个占位符 Global.skin 文件:

App_Themes
- Global
  \Global.skin (primary)
- ThemeA 
  \Global.skin (empty placeholder)
- ThemeB
  \Global.skin (empty placeholder)

然后,在VirtualPathProvider中,您将对App_Themes\*\Global.skin的所有请求重新路由到App_Themes\Global\Global.skin

选项 #2:使用构建后任务

这是对上述解决方案的修正,避免了预编译网站的限制;而不是在运行时进行重新路由,您可以通过 ms-build 任务在构建后应用它,该任务只是将Global\Global.skin传播到所有其他主题文件夹。

我已经成功使用了这两个选项。

于 2009-10-17T17:56:39.637 回答
0

您需要在每个主题下列出它,但您只需要为每个主题列出一个控件定义。如果您希望外观成为控件的默认行为,请指定不带 SkinID 属性的定义。

于 2009-10-16T19:00:13.570 回答