180 likes | 370 Views
主题与样式. 重点内容: 创建主题的方法 将主题应用于整个程序 主题文件控制 Html 控件的方法 在页面中更换主题的方法. 主题样式. 在本章中将首先讲述网站显示风格的设计。随着网站功能的增强,网站逐渐变得庞大起来。现在一个网站包括几十、上百个网页已是常事。这种情况下,如何简化对众多网页的设计和维护,特别是如何解决好对一批具有同一风格网页界面的设计和维护,就成为了比较普遍的难题。 ASP.NET 2.0 提供的主题样式技术,从统一控件的外貌、局部再到全局风格的一致提供了最佳的解决方案。本章将讲述这种技术。. 主 题. 1 概述
E N D
主题与样式 • 重点内容: • 创建主题的方法 • 将主题应用于整个程序 • 主题文件控制Html控件的方法 • 在页面中更换主题的方法
主题样式 • 在本章中将首先讲述网站显示风格的设计。随着网站功能的增强,网站逐渐变得庞大起来。现在一个网站包括几十、上百个网页已是常事。这种情况下,如何简化对众多网页的设计和维护,特别是如何解决好对一批具有同一风格网页界面的设计和维护,就成为了比较普遍的难题。ASP.NET 2.0提供的主题样式技术,从统一控件的外貌、局部再到全局风格的一致提供了最佳的解决方案。本章将讲述这种技术。
主 题 • 1 概述 • 2 创建主题的方法 • 3 同一控件多种定义的方法 • 4 将主题文件应用于整个应用程序 • 5.主题文件控制Html控件的方法 • 6.在页面中更换主题的方法 • 7. stylesheettheme 和 theme 的区别
概述 • 主题(Theme)是ASP.NET 2.0提供的一种新技术。利用主题可以为一批服务器控件定义外貌。例如,可以定义一批TextBox或者Button服务器控件的底色、前景色;定义buildlist控件的样式等。主题与级联样式表(CSS)不同。级联样式表只能用来定义HTML的标记。而主题可以用来定义服务器控件。如果将两者结合就可以定义不同类型的控件。
1.2 创建主题的方法 系统为创建主题制定了一些规则,但没有提供什么特殊的工具。这些规则是:对控件显示属性的定义必须放在以“.skin”为后缀的皮肤文件中,而皮肤文件必须放在“主题目录”下,而主题目录又必须放在专用目录App_Themes的下面。每个专用目录下可以放多个主题目录;每个主题目录下面可以放多个皮肤文件。只有遵守这些规定,在皮肤文件中定义的显示属性才能够起作用。 下面举例说明创建的过程。 (1) 右击网站名,选择【添加文件夹】命令,然后选择【主题文件夹】项,系统将会在应用程序的根目录下自动生成一个专用目录App_Themes,并且在这个专用目录下放置主题文件夹,这里给文件夹取名为Themes1。 (2) 右击主题文件夹名,在弹出的菜单中选择【外观文件】。 (3) 弹出一皮肤文件的框架,可以给该文件改名,但是文件的后缀必须是“.skin”,这里取名为SkinFile.skin。 专用目录、主题目录、皮肤文件三者之间的关系如图16.1所示。 (4) 在皮肤文件(这里是SkinFile.skin)中给TextBox和Button两种控件定义显示的语句如下。
<asp:TextBox • BackColor = "Orange" • ForeColor = "DarkGreen" • Runat = "server" /> • <asp:Button • BackColor = "Orange" • ForeColor = "DarkGreen" • Font-Bold = "true“ 图16.1 专用目录、主题目录和皮肤文件的关系 • Runat= "server" /> • 文件中将两种控件的背景色都定义成Orange,前景色定义成DarkGreen。对Button 控件的字体定义成粗体。 • 值得注意的是,有的控件(如LoginView、User Control等)不能用skin文件定义外貌。能够定义的控件也只能定义它们的外貌属性,其他行为属性(如AutoPostBack属性等)不能在这里定义。 • (5) 在同一个主题目录下,不管定义了多少个皮肤文件,系统都会自动将它们合并成为一个文件。 • (6) 项目中凡需要使用本主题的网页,都需要在网页的定义语句增加“Theme = [主题目录]”的属性,例如: • <%@ Page Theme="Themes1"… %> • 在设计阶段,并看不出皮肤文件中定义的作用,只有当程序运行时,在浏览器中才能够看到控件外貌的变化。图16.2就是TextBox和Button控件在上述定义中显示的界面。
1.2 创建主题的方法 图16.2 用皮肤文件定义控件的外貌
1.2 创建主题的方法 图16.1 专用目录、主题目录和皮肤文件的关系
1.3 同一控件多种定义的方法 有时需要对同一种控件定义多种显示风格,此时可以在皮肤文件中,在控件显示的定义中用SkinID属性来区别。例如,在TextBox.skin文件中对TextBox的显示定义了三种显示风格: <asp:TextBox BackColor="Green" Runat="Server" /> <asp:TextBox SkinID="BlueTextBox" BackColor="Blue" Runat="Server" /> <asp:TextBox SkinID="RedTextBox" BackColor="Red" Runat="Server" />
1.3 同一控件多种定义的方法 其中第一个定义为默认的定义,中间不包括SkinID。该定义将作用于所有不注明SkinID的TextBox控件。第二和第三个定义中都包括SkinID属性,这些定义只能作用于SkinID相同的TextBox控件。 在网页中为了使用主题,应该做出相应的定义。例如: <%@ Page Theme="Themes1" %> <html> <head runat="server"> <title>用皮肤文件定义TextBox的外貌</title> </head> <body> <form id="form1" runat="server"> <asp:TextBox id="TextBox1" Runat="Server" /> <br /> 实际上每个常用服务器控件的属性窗口中都有一个SkinID属性,通过该属性的下拉列表可以直接确定在皮肤文件中的选项。
<asp:TextBox • id="TextBox2" • SkinID="BlueTextBox" • Runat="Server" /> • <br />图16.3 不同定义下的三个TextBox控件 • <asp:TextBox • id="TextBox3" • SkinID="RedTextBox" • Runat="Server" /> • </form> • </body> • </html> • 程序运行中三个TextBox控件分别显示不同的风格。情况如图16.3所示。 图16.3 不同定义下的三个TextBox控件
1.4 将主题文件应用于整个应用程序 • 为了将主题文件应用于整个应用项目,可以在应用项目根目录下的Web.config文件中进行定义。例如,要将Themes1主题目录应用于应用项目的所有文件中,可以在Web.confiog文件中定义如下: <configuration> <system.web> <pages theme="Themes1" /> </system.web> </configuration> 这样就不用在每个网页中定义使用的主题文件了。
1.5主题文件控制Html控件 本示例用于介绍为主题添加CSS文件的实现方法,其内容包括为页面背景、页面中所有超链接文本和普通HTML文本框创建样式。
在主题文件夹中添加CSS样式表 body { background-color: silver; } A:link { color: Blue; text-decoration: underline; } A:visited { color: Blue; text-decoration: underline; } A:hover { color: Red; text-decoration: none; } INPUT { background-color: Orange; }
1.6通过下拉列表选择主题 • 本示例说明了实现动态加载主题的实现方法。这种方法的核心是在Page_PreInit事件处理程序中设置Page对象的Theme属性值。
/*分为五个步骤*/ • void Page_PreInit(Object sender, EventArgs e) • { • //设置页面所设置的主题 • string theme=""; • if (Request.QueryString["theme"] == null) • //2.接收参数值,并且判断参数值的内容 • { • theme = "Red";//3.将参数值的内容赋值给变量theme • } • else • { • theme = Request.QueryString["theme"]; • } • Page.Theme = theme;//4.将变量theme的值赋值给本网页的主题样式page.theme,这样日历的色彩被改变了
//设置DropDownList控件的选中项 • /*ListItem item = DropDownList1.Items.FindByValue(theme);//定义item使之成为变量theme在下拉列表框中对应的项 • if (item != null) • { • item.Selected = true; • }*///item有三种可能,第一种是无参数,那么此段代码不值行,下拉列表框仍然是默认的红色项为被选中状态 • //第二种可能为参数是RED,执行这段代码后,页面为红色被选中 • //第三种可能为参数是BLUE,执行这段代码后,页面为蓝色被先中 • } • void SelectedIndexChanged(Object sender, EventArgs e) • { • //获取DropDownList选中项值,并进行页面重定向 • string url = Request.Path + "?theme=" + DropDownList1.SelectedItem.Value;//1.客户更改下拉列表框后产生参数值并使页面刷新 • Response.Redirect(url); • }
1.7 stylesheettheme 和 theme 的区别 stylesheettheme 和 theme属性可以同时应用,起应用方法基本都是一样的,只是执行的优先级不同 1、如果页面单独使用stylesheettheme属性指定主题,那么内容页内定义的控件属性将覆盖sylesheettheme定义的控件属性 2、如果页面单独使用theme属性,那么只执行theme属性所定义的主题,内容页内定义的属性将不起作用 3、如果页面内同时定义stylesheettheme和theme属性指定主题,那么优先级是 stylesheettheme >> 内容页内定义的属性>>然后才是theme 在SkinFile(SkinFile.skin)可以建 StyleSheet.css 引用 Theme="SkinFile" 就可以用到 StyleSheet.css中的样式