样式

更新:2007 年 11 月

每个 ASP.NET 移动控件都提供样式属性,您可以使用这些属性来自定义如何呈现控件。为便于使用,可对样式进行分组,以便在页的不同元素之间保持样式一致性。使用 StyleSheet 控件或 Style 元素可访问特定于控件和设备功能的属性。

说明:

不能保证样式属性设置被接受。如果目标设备不支持特定样式,则 ASP.NET 忽略该样式,或者替换为不同的样式。

样式继承

除非(通过样式引用直接或间接地)在控件中显式指定样式属性,否则控件将继承其容器的样式属性。大多数样式属性默认为 null 或者 NotSet 的枚举值。这样可以很容易将已显式设置的样式属性与尚未设置的样式属性区分开。

显式声明样式

有两种方法为控件显式声明样式。一种方法是设置样式属性。例如,假设您创建一个窗体,并向该窗体添加一个 Label 控件。(然后此标签成为该窗体的子控件。) 然后,当您将该标签的 Font-Name 属性设置为“Arial”时,该标签使用 Arial 字体。

为子控件显式设置样式的另一种方法是设置控件的 StyleReference 属性。

使用 DeviceSpecific 控件设置样式

您也可以通过 DeviceSpecific 控件来设置样式属性。下面的示例演示一个标签,它对大多数设备显示为斜体,而在桌面设备上显示时则为粗体。

<%@ Page Inherits="System.Web.UI.MobileControls.MobilePage" %>
<script language="C#" runat="server">
// A custom method to determine if the page 
// is displayed on a mobile device
public bool IsDesktop(System.Web.Mobile.MobileCapabilities 
    capabilities, String argument)
{
    return !capabilities.IsMobileDevice;
}
</script>
<Mobile:StyleSheet runat="server">
  <Style Name="ListStyle" Font-Italic="true">
    <DeviceSpecific>
      <Choice Filter="IsDesktop" Font-Italic="false" 
        Font-Bold="true" />
    </DeviceSpecific>
  </Style>
</Mobile:StyleSheet>
<Mobile:Form runat=server>
  <Mobile:Label id="list1" runat=server StyleReference="ListStyle">
    Here is some text
  </Mobile:Label>
</Mobile:Form>

引用样式的查找算法

当通过 StyleReference 属性引用样式时,ASP.NET 遵循特定的检查顺序来确定应用什么样式。对于子控件(父容器控件内的控件),下面的列表使用 Font-Size 作为示例描述了确定该子级特性的规则:

  1. 如果为子控件显式设置了 Font-Size 属性,则该控件使用此设置。

  2. 否则,如果设置了子控件的 StyleReference 属性 (Property)(例如 myChild.StyleReference = someStyle),则该控件使用来自被引用的 Style 元素(例如 someStyle)的 Font-Size 属性 (Attribute) 值。子控件通过执行以下操作来访问该值:

    1. 该子级在当前 MobilePage 实例的样式表中查找引用的样式。

    2. 如果该子级在页的样式表中未找到此样式,它将引用系统默认样式表。

    3. 如果该子级在这两个样式表中都未找到此样式,则会发生运行时错误。

  3. 如果不可以直接或间接使用样式,则 StyleReference 属性 (Property) 未设置,而且子控件通过以递归方式将此过程应用于父控件来获得其 Font-Size 属性 (Attribute) 的值。

  4. 如果递归过程到达了控件层次结构的顶部,仍没有找到 Font-Size 属性的显式值,则该控件使用默认的字体大小。

此算法允许从多个控件引用不同的样式。它支持从包含控件继承,并遵循标准编码和逻辑规则。

查找算法的异常

查找算法有两个异常:

  • 背景色不从父级对象中接收值。(这与级联样式表的行为是一致的。)

  • DeviceSpecific 控件不从父控件继承值。DeviceSpecific 控件通常是为特定控件或控件类型显式创作的。

样式表

ASP.NET 移动控件提供默认样式表,该样式表为您设置数量有限的样式。有关更多信息,请参见 StyleSheet。您可以很容易重写这些默认样式中的值,以应用自己的样式。单个样式表中可以驻留任意多个 <Style> 元素声明。每个 <Style> 元素由一个唯一的 Name 属性标识。您可以将另一个控件的 StyleReference 属性设置为 Name 属性,从而引用其样式。也可以使用此方法引用其他样式中的样式。

外部样式表

可以定义一个外部样式表供多个控件使用。如果希望在多个页中使用同一个样式,使用外部样式表很有用。若要创建外部样式表,请在 .ascx 文件中创建一个用户控件,在其中放置一个包含样式集的 StyleSheet 控件。然后,要引用此文件,请将一个 StyleSheet 控件放在移动页上,并将它的 ReferencePath 属性设置为用户控件的相对 URL。

外部样式表的实现

实现外部样式表需要三个步骤:

  1. 在 .ascx 文件中编写 Microsoft ASP.NET 移动用户控件。

  2. 在 .ascx 文件中放置一个样式表,并添加所需的 <Style> 元素。

  3. 声明样式表,在要使用外部样式表的每个移动页中,将 ReferencePath 属性设置为用户控件的 .ascx 文件名。

运行时,在外部样式表中声明的所有样式都可由 ASP.NET 页框架用于移动页上的样式表。有关用户控件的更多信息,请参见用户控件

Style 对象和 Style 类的特性

Style 对象不是真正的控件,而且不从 MobileControl 基类继承。在页上,只能通过使用 <Style> 元素在 StyleSheet 控件内部声明该对象。

Style 基类包含所有移动控件共有的样式特性。从 Style 类继承的类包含其关联控件特定的附加样式特性。

每个 MobileControl 内部都包含一个 Style 对象。但是,此 Style 对象不是通过公共成员公开的。相反,对于每个样式属性,MobileControl 都有一个可公开访问的属性,该属性可在内部引用包含的私有样式。因此,MobileControl 直接公开样式属性,例如 FontForeColorWrapping

样式的组织

可以将样式组织到 StyleSheet 控件中。在一个样式表中,可以声明任意多个样式对象。声明样式的方法与声明任何控件的方法相同,只是不需要 runat=server 属性。有关更多信息,请参见 <Style> 元素

样式通过将它的 StyleReference 属性设置为父级样式的名称,可从样式表中的其他样式继承属性。此行为的作用范围是移动页。也就是说,只能引用同一移动页中的样式表上的样式。若要让控件从样式表中的样式对象获取样式,请将其样式对象的 StyleReference 属性 (Property) 设置为该样式的名称,方法是在 ASP.NET 移动网页中声明 StyleReference 属性 (Attribute),或以编程方式设置 StyleReference 属性 (Property)。

请参见

任务

演练:实现新样式

概念

窗体

面板

分页

其他资源

创建自定义移动控件

ASP.NET 移动控件的设计和呈现概念

应用程序开发人员指南