yanwei067

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

.net 主题与样式

理论上上来说,不同的主题中的样式表和SKIN文件的结构都应该是完全相同的。
3)  设置你要应用主题的控件的css样式名为css中定义的样式名(比如column、gradient)
设置你要应用主题的服务器控件的SkinId为Skin文件中定义的skinid(比如login、create等),这样在Skin中定义的控件属性会自动附加到当前的控件上(内部也是使用CSS实现的)
4)  应用主题,有三种办法      
       全局主题:在Web.config中<system.web>中添加<pages StyleSheetTheme ="ThemeName"/>节,这样在整个应用中都会自动应用名为ThemeName 的主题
       页面主题:在ASPX文件顶部加入:<%@ Page Language="C#" StylesheetTheme=" ThemeName " %>,这样当前页面都会应用名为ThemeName 的主题,或者在ASPX_CS中加(Page_Load方法)入如下代码 Page. StyleSheetTheme = “ThemeName”; 
       角色主题:需要使用masterpage 来辅助实现 ,通过User.IsInRole(“RoleName”) 来判断用户是否属于某个角色,然后决定使用何种主题(Page. StyleSheetTheme = “ThemeName”);当然,使用这种办法还可以应用用户选择的主题
       如果你仍然感觉迷惑,请查看 Quick Start 。
(二)  工作原理
    不同的主题和皮肤之间的不同主要是页面和页面中的控件的样式(包括字体、段落、背景、边框等等)、部分图片的不同。
    传统的完全使用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 ,我猜想区别是使用 Theme 时位于主题文件夹中的 样式表(CSS)文件不会被应用到主题中,但是根据我的测试,发现两种情况下生成的页面中,只有<link href=’’>这一节的位置不同,一个出现在<Title>标记前面,一个则是后面。
(四)  优雅之处
a)         完全Framework内建的支持、不再需要复杂的编程,甚至不再需要编程;
b)        在vs2005中有非常友好的设计时支持,也就是说,在设计的时候你就可以看到某种主题的效果;
c)        学习曲线很平缓,如果你熟悉CSS的话,则更加没有难度。
-----------------
a、页面里相同的控件使用不同的样式:在该控件后面加skinID
  b、把定义好的theme应用到整个页面:在该页的Page页签里加上属性theme=“theme名称”
  c、把定义好的theme应用到整个站点:在web.config文件system.web的配置节中加上<pages theme="theme名称">
  d、动态的更换站点的样式(主题、皮肤):在Page_PreInit事件中写代码,Page.Theme = "...";
  e、控件中应用样式的优先级:a、StyleSheetTheme引用的风格[优先级最低]
 
                           b、代码设定的控件属性(覆盖StyleSheetTheme)
 
                           c、Theme引用的风格(覆盖前面2个) [优先级最高]
  f、让某个控件不应用theme里面定义的风格:更改属性EnableTheming=false即可
 
141 /**//// <summary>
  142 /// 获取当前的表达式对所选列进行排序
  143 /// </summary>
  144 protected void SearchSortExpression(string[] sortColumns, string sortColumn, out string sortOrder, out int sortOrderNo)
  145 {
  146 sortOrder = "";
  147 sortOrderNo = -1;
  148 for (int i = 0; i < sortColumns.Length; i++)
  149 {
  150 if (sortColumns[i].StartsWith(sortColumn))
  151 {
  152 sortOrderNo = i + 1;
  153 if (AllowMultiColumnSorting)
  154 {
  155 sortOrder = sortColumns[i].Substring(sortColumn.Length).Trim();
  156 }
  157 else
  158 {
  159 sortOrder = ((SortDirection == SortDirection.Ascending) ? "ASC" : "DESC");
  160 }
  161 }
  162 }
164 /**//// <summary>
  165 /// 绘制升序降序的图片
  166 /// </summary>
  167 protected void DisplaySortOrderImages(string sortExpression, GridViewRow dgItem)
  168 {
  169 string[] sortColumns = sortExpression.Split(",".ToCharArray());
  170
  171 for (int i = 0; i < dgItem.Cells.Count; i++)
  172 {
  173 if (dgItem.Cells[i].Controls.Count > 0 && dgItem.Cells[i].Controls[0] is LinkButton)
  174 {
  175 string sortOrder;
  176 int sortOrderNo;
  177 string column = ((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
  178 SearchSortExpression(sortColumns, column, out sortOrder, out sortOrderNo);
  179 if (sortOrderNo > 0)
  180 {
  181 string sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl : SortDescImageUrl);
  182
  183 if (sortImgLoc != String.Empty)
  184 {
  185 Image imgSortDirection = new Image();
  186 imgSortDirection.ImageUrl = sortImgLoc;
  187 dgItem.Cells[i].Controls.Add(imgSortDirection);
189 }
  190 else
  191 {
  192
  193 if (AllowMultiColumnSorting)
  194 {
  195 Literal litSortSeq = new Literal();
  196 litSortSeq.Text = sortOrderNo.ToString();
  197 dgItem.Cells[i].Controls.Add(litSortSeq);
  198
  199 }
  200 }
  201 }
  202 }
  203 }
  204
  205 }
posted on 2007-10-16 10:23  一缕光  阅读(1242)  评论(1编辑  收藏  举报