“第 3 章: 深入了解文本”摘要

注意

本书于 2016 年春季出版,之后再未更新。 书中有许多内容仍然有价值,但有些内容已过时,有些主题不再完全正确或完整。

本章节更深入地探讨了 Label 视图,包括颜色、字体和格式设置。

段落换行

如果 LabelText 属性包含长文本,Label 会自动将它换行为多行,如 Baskervilles 示例所示。 可以嵌入 Unicode 代码(如表示长破折号的“\u2014”)或 C# 字符(如“\r'”)换到新行。

如果 LabelHorizontalOptionsVerticalOptions 属性设置为 LayoutOptions.Fill,那么 Label 的总尺寸由其容器提供的可用空间决定。 Label 被认为是受约束的Label 的尺寸就是它的容器尺寸。

如果 HorizontalOptionsVerticalOptions 属性设置为除 LayoutOptions.Fill 以外的值,那么 Label 的尺寸由文本呈现所需的空间决定,最大尺寸是其容器为 Label 提供的可用空间。 Label 被认为是不受约束的,它决定自己的尺寸。

(注意:术语“受约束”和“不受约束”可能是违反常理的,因为不受约束的视图通常小于受约束的视图。此外,这两个术语与本电子图书前面章节中的用法不一致。)

Label 等视图可以在一个维度上受约束,而在另一个维度上不受约束。 Label 仅在水平方向受约束时才将文本换行为多行。

如果 Label 受约束,它可能会占用比文本呈现所需大得多的空间。 可以在 Label 的整个区域内定位文本。 将 HorizontalTextAlignment 属性设置为 TextAlignment 枚举的成员(StartCenterEnd),可以控制段落中所有行的对齐方式。 默认值为 Start,即左对齐文本。

VerticalTextAlignment 属性设置为 TextAlignment 枚举的成员,可以将文本定位在 Label 所占区域的顶部、中间或底部。

LineBreakMode 属性设置为 LineBreakMode 枚举的成员(WordWrapCharacterWrapNoWrapHeadTruncationMiddleTruncationTailTruncation),可以控制段落中多行的换行或截断方式。

文本颜色和背景色

LabelTextColorBackgroundColor 属性设置为 Color 值,可以控制文本颜色和背景色。

BackgroundColor 应用于 Label 所占整个区域的背景。 此尺寸可能比文本显示所需的区域大得多,具体视 HorizontalOptionsVerticalOptions 属性而定。 可以使用 Color 来试验 HorizontalOptionsVerticalOptionsHorizontalExeAlignmentVerticalTextAlignment 的不同值,看看它们对 Label 的尺寸和位置以及文本在 Label 中的尺寸和位置有何影响。

颜色结构

使用 Color 结构,可以将颜色指定为红-绿-蓝 (RGB) 值,或色调-饱和度-发光度 (HSL) 值,或颜色名称。 还可以使用 alpha 通道来指明透明度。

使用 Color 构造函数可以指定:

参数是介于 0 和 1 范围之间的 double 值。

还可以使用多个静态方法来创建 Color 值:

  • Color.FromRgb:用于创建介于 0 和 1 范围之间的 double RGB 值
  • Color.FromRgb:用于创建介于 0 和 255 范围之间的整数 RGB 值
  • Color.FromRgba:用于创建包含透明度的 double RGB 值
  • Color.FromRgba:用于创建包含透明度的整数 RGB 值
  • Color.FromHsla:用于创建包含透明度的 double HSL 值
  • Color.FromUint,用于得出 uint 值,计算公式为 (B + 256 * (G + 256 * (R + 256 * A)))
  • Color.FromHex:用于创建十六进制数字格式的 string,格式为“#AARRGGBB”、“#RRGGBB”、“#ARGB”或“#RGB”,其中每个字母分别对应 alpha 通道、红色通道、绿色通道和蓝色通道的十六进制数字。 此方法主要用于 XAML 颜色转换,如第 7 章:XAML 与代码中所述。

一旦创建,Color 值就不可变。 可以从下面的属性获取颜色特征:

这些全都是介于 0 和 1 范围之间的 double 值。

Color 还为常见颜色定义了 240 个公共静态只读字段。 截至本电子图书撰写之时,只有 17 种常见颜色可供选择。

另一个公共静态只读字段定义了将所有颜色通道都设置为零的颜色:

多个实例方法允许通过修改现有颜色来新建颜色:

最后,两个静态只读属性定义了特殊颜色值:

Color.Default 旨在强制执行平台的配色方案,因此它的含义因平台和上下文而异。 默认情况下,平台的配色方案为:

  • iOS:浅色背景上深色文本
  • Android:深色背景上浅色文本(在图书中),或浅色背景上深色文本(在示例代码存储库的主分支中通过 AppCompat 用于 Material Design)
  • UWP:浅色背景上深色文本

Color.Accent 值生成特定于平台(有时为用户可选择)的颜色,它在深色或浅色背景上都是可见的。

更改应用程序配色方案

各种平台都有默认配色方案,如上面的列表所示。

以 Android 为目标时,可以在 Android.Manifest.xml 文件中指定浅色主题,切换到浅色背景上深色文本的配色方案。

对于 Windows 平台,配色方案通常是由用户选择的,但你可以在平台的 App.xaml 文件中添加设置为 LightDarkRequestedTheme 特性。 默认情况下,UWP 项目中的 App.xaml 文件包含设置为 LightRequestedTheme 特性。

字号和字体特性

LabelFontFamily 属性设置为“Times Roman”等字符串,可以选择字体系列。 不过,需要指定特定平台支持的字体系列,在这方面平台是不一致的。

LabelFontSize 属性设置为 double,可以指定大致字体高度。 若要详细了解如何智能选择字号,请参阅第 5 章:处理字号

也可以从多个平台相关预设字号中选择一个。 静态 Device.GetNamedSize 方法和重载都根据 NamedSize 枚举的成员(DefaultMicroSmallMediumLarge)返回与平台相对应的 double 字号值。 从 Medium 成员返回的值不一定与 Default 相同。 NamedFontSizes 示例使用这些命名字号显示文本。

LabelFontAttributes 属性设置为这些 FontAttributes 枚举的成员(BoldItalicNone)。 可以将 BoldItalic 成员与 C# 位 OR 运算符结合使用。

带格式文本

到目前为止,在所有示例中,Label 显示的整个文本已被统一格式化。 若要让文本字符串中的格式设置不同,请不要设置 LabelText 属性。 相反,请将 FormattedText 属性设置为类型 FormattedString 的对象。

FormattedStringSpans 属性,此属性是 Span 对象集合。 每个 Span 对象都有自己的 TextFontFamilyFontSizeFontAttributesForegroundColorBackgroundColor 属性。

VariableFormattedText 示例展示了如何对单行文本使用 FormattedText 属性;VariableFormattedParagraph 展示了对整个段落使用的技术,如下所示:

可变格式化段落的三倍屏幕截图

NamedFontSizes 程序使用一个 LabelFormattedString 对象显示每个平台的所有命名字号。