导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

Windows Phone 的文本和字体

2014/6/18

适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

Windows Phone 提供用于呈现文本的若干元素,以及用于创建多种格式化文本的属性集。

本主题包括以下部分。

概括地说,Windows Phone 中的文本元素是以下对象之一:

这些元素共享具有一组属性的特性,这些属性控制文本在元素或元素内容中显示的方式。这些属性为:FontFamilyFontSizeFontStretchFontStyleFontWeightForeground。这些属性的实现不一定作为公共继承的一部分在这些元素之间共享,但这些实现在各文本元素中是相似的。

TextBlock

TextBlock 对象是在基于 Windows Phone 的应用程序中显示只读文本的主要元素。下面的 XAML 演示如何定义 TextBlock 元素,并将它的 Text 属性设置为字符串。

<TextBlock Text="Hello, world!" />

下图显示了前面的 XAML 的结果。

使用默认字体属性呈现的 TextBlock

"Hello, world!" textblock.

TextBlock 还支持针对其内容的基本文本模型,在本主题的“TextBlock 文本模型”部分中将对此加以论述。

文本控件

TextBlock 不是直接显示文本的唯一 Windows Phone UI 元素。TextBoxPasswordBoxRichTextBox 也是文本元素。这些类从 Control 类派生,后者实现与文本和字体相关的多种属性。但是,从 Control 派生的类并不总是能够显示文本,甚至支持可包含文本元素的内容模型。下面是对 Control 类实现的相关文本和字体属性的列表:

Control.FontFamily

Control.FontSize

Control.FontStretch

Control.FontStyle

Control.FontWeight

此外,尽管不专用作字体属性,但 Foreground 提供了 Brush 以用于 Windows Phone 文本元素中的显示文本。

文本控件中的字体属性继承

文本和字体属性在 Control 级别实现的原因之一就是为了控件可以支持字体属性的属性值继承。这样就能够定义具有来自模板的复合部件的控件,以及能够让父控件的字体属性应用于显示文本字符串的任何复合部件或内容。

例如,ComboBox 是可能显示其他元素或可能显示文本的项控件。如果您对 ComboBox 设置字体属性,则这些字体属性将自动由其他元素或所显示的文本继承(不要求控件逻辑进行任何特殊处理)。对于显示的文本,字体属性的继承特别有用,因为除此方式之外无法将特性应用于该文本。自定义控件中的复合部件和文本内容可以通过完全相同的方式继承其基于 Control 的字体属性。

当复合部件是 TextBlock 时,字体属性的属性继承可发挥作用。尽管 TextBlock 从技术角度讲不是一个控件,也不与其父级共享属性实现,但仍可通过这种方式来继承属性。这是控件与 TextBlock 之间的字体属性为何相似的原因之一。

如果您通过 Style 或适用的模板设置文本元素属性,则子元素将在运行时继承这些属性。对于文本元素属性的运行时更改也将其新值传播到继承的子文本元素。

在使用文本元素时,您可以在 XAML 中指定文本元素的不同字体特性,这些特性与该元素的类中提供的属性并行。下表列出了可以为各文本元素指定的字体特性。

属性

描述

说明

FontFamily

指定所需字体系列,如"Times New Roman"。

默认值为“可移植用户界面”,相关说明可见于本主题中的“支持的本地字体”部分。FontFamily 可以包括引用字体文件的 URI 字符串(以及该文件内用 # 字符分隔开的字体系列)。在用户系统上不使用字体就是这种情况,您将字体文件作为应用程序的主程序集分发。有关详细信息,请参阅 FontFamily

FontSize

指定所需字体大小(以像素为单位)。值必须为非负数。

默认值为 11 像素。

FontStretch

指定所需的字体标志符号宽度。

默认值为 NormalFontStretch 的效果依赖于正使用的特定字体系列,并且只能指定字体系列中已经存在的字体。该属性不会导致以编程方式拉伸标志符号。(注意:如果 FontStretch 映射不可用,您可以考虑将某一变换应用于文本。)

FontStyle

指定所需字形为普通还是斜体。

默认值为 NormalFontWeight 的效果依赖于正使用的特定字体系列,并且通常只能指定字体系列中已经存在的字体。Windows Phone 不以编程方式创建修剪变形来模拟斜体。

FontWeight

指定所需的字体标志符号粗细。

默认值为 NormalFontWeight 的效果依赖于正使用的特定字体系列,并且通常只能指定字体系列中已经存在的字体。Windows Phone 不会以编程方式创建备用粗细值,除非字体系列中包含普通粗细字体,而不包含粗体字体。在这种情况下,Windows Phone 将通过增加使用二维图形算法的笔画宽度来模拟粗体字体。

TextDecorations

指定一种类型的可能修饰和下划线。

默认设置为无修饰。若要指定下划线修饰,请将 TextDecorations 特性设置为 UnderlineTextDecorations 可用作针对 TextBlock 和内联项的属性,但不可用于基于 Control 的文本元素。

以下 XAML 示例演示如何定义 TextBlock 元素以及指定上表所列的所有字体属性(TextDecorations 除外)。

说明注意:

根据 Windows Phone 所选择的字体,指定的字体属性可能不是呈现期间所用的字体。有关更多信息,请参见本主题后面的“字体选择”一节。

<TextBlock
  Text="Font Attributes"
  FontFamily="Verdana"
  FontSize="36"
  FontStretch="UltraExpanded"
  FontStyle="Italic"
  FontWeight="ExtraBlack" />

下图显示了前面的 XAML 内容示例的结果。

使用定义的字体属性值呈现 TextBlock

Font attributes.

可用字体取决于您的 Windows Phone 版本。

说明注意:

有关 Windows Phone 中支持的字体列表,请参见 Windows Phone 8 的字体和语言配置支持

通常,您可以使用客户端计算机上的字体子集。文本元素可以使用以下拉丁字体(如果在本地计算机上可用)。

  • Arial

  • Arial Black

  • Arial Unicode MS

  • Calibri

  • Cambria

  • Cambria Math

  • Comic Sans MS

  • Candara

  • Consolas

  • Constantia

  • Corbel

  • Courier New

  • 格鲁吉亚

  • Lucida Sans Unicode

  • Segoe UI

  • 符号

  • 宋体

  • Times New Roman

  • Trebuchet MS

  • 宋体

  • Wingdings

  • Wingdings 2

  • Wingdings 3

“可移植的用户界面”是一种复合字体。它使用若干字体来实现 Windows Phone 所支持的一组国际语言。

如果要使用东亚文本,通常文本元素可以使用以下东亚字体(如果在本地计算机上可用):

  • Batang

  • Meiryo

  • MS Gothic

  • MS Mincho

  • MS PGothic

  • MS PMincho

  • PMingLiU

  • 宋体

运行 Microsoft Windows 的计算机上的 Windows Phone 中的文本元素还可以使用以下东亚字体(如果在本地计算机上可用):

  • BatangChe

  • DFKai-SB

  • Dotum

  • DutumChe

  • FangSong

  • GulimChe

  • Gungsuh

  • GungsuhChe

  • KaiTi

  • Malgun Gothic

  • Microsoft JhengHei

  • Microsoft YaHei

  • MingLiU

  • MingLiu_HKSCS

  • MingLiu_HKSCS-ExtB

  • MingLiu-ExtB

  • MS UI Gothic

  • NSimSun

  • NSimSun-18030

  • PMingLiu-ExtB

  • SimHei

  • SimSun-18030

  • SimSun-ExtB

字体选择

您指定的字体不一定是 Windows Phone 使用的字体。Windows Phone 从支持的本地字体、从 FontFamily 属性所引用的包文件中提供的字体,或者从传递到 FontSource 属性的基于流的 zip 或 .ttf 文件中选择字体。显示的结果是基于 FontFamilyFontStretchFontStyleFontWeight 属性的值的最佳匹配字体。务必指定上述全部四个字体属性,以确保为您的文本元素做出准确一致的字体选择。

指定非默认字体

Windows Phone 不在其安装包中包括任何字体,它依赖本地系统字体作为其默认值。若要对文本元素使用支持的本地字体列表中未包括的字体,可以通过使用 FontFamily 属性在 XAML 中指定该字体,或通过使用 FontSource 属性在代码中指定该字体。FontFamily 属性可以指定单个字体文件或包含字体文件的 zip 文件,并且可以纳入备用序列。为 XAML FontFamily 用法引用的任何字体文件必须作为资源嵌入到程序集内。使用 FontSource 时,您的代码可以从独立存储之类的流中加载字体(或字体压缩包)的源字体文件,或者从 XAP 包中加载。

有关更多信息,请参见描述类的相关页:FontFamilyFontSource

Foreground 属性支持您为呈现的文本指定 Brush。下面的 XAML 显示针对 Foreground 的最简单的用法,该用法使用一个指定颜色字符串,该字符串将该颜色的 SolidColorBrush 应用于文本。请注意,针对 TextBlock 以及其中的每个 Run 文本元素单独设置 Foreground

<!-- TextBlock with different brushes applied to parts of the text. -->
<TextBlock
  FontFamily="Verdana"
  Foreground="Navy">
  Navy
  <Run Text="DodgerBlue " Foreground="DodgerBlue"/>
  <Run Text="LightSteelBlue " Foreground="LightSteelBlue"/>
</TextBlock>

纯色不是将前景应用于字体的唯一方式。您可以在 Windows Phone 中使用任何 Brush 派生类,包括 RadialGradientBrushLinearGradientBrushImageBrushVideoBrush。如果您在 XAML 中指定这些画笔,则必须使用属性元素语法,或者使用资源引用之类的引用。下面的 XAML 显示一个示例,该示例使用属性元素语法并且为文本指定 ImageBrush

<TextBlock Text="SHRUBBERY">
  <TextBlock.Foreground>
    <ImageBrush ImageSource="forest.jpg"/>
  </TextBlock.Foreground>
</TextBlock>

下图演示前面的 XAML 中呈现的文本。

呈现图像画笔的 TextBlock

Output from an ImageBrush.

TextBlock 中设置文本时,您还可以使用直观的内部文本形式,而非显式的 Text 属性集,如下面的示例所示:

<TextBlock>Hello, world!</TextBlock>
说明注意:

设置 Text 属性时不会保留前导或尾随的空白,只保留内部空白。有关处理 XAML 中的空白的更多信息,请参见 Windows Phone 8 的 XAML

使用 Run 和 LineBreak 对象

TextBlock 还可以显示在不同的 Run 元素(其中,每个元素都可以具有不同字符级别的格式设置)中包含的一系列字符串,而非显示单个字符串。LineBreak 对象表示 TextBlock 中的显式新行,并且通常用于环绕在 Run 元素之间。LineBreakRun 共享一个基类 (Inline),这使 TextBlock 可以承载其文本模型内容的强类型的 InlineCollection。该 InlineCollection 还是 TextBlock XAML 内容属性,并且最终结果是,为了在 TextBlock 模型中指定项,您只需将不同的 RunLineBreak 元素指定为 TextBlock 的子元素。

下面的 XAML 演示如何通过使用多个 Run 对象(用 LineBreak 对象分隔)在 TextBlock 中定义具有不同格式设置的若干字符串。

<!-- Display formatted text as Run objects within a TextBlock. -->
<Canvas>
<TextBlock
  FontFamily="Arial" Width="400" Text="Sample text formatting runs">
  <LineBreak/>
  <Run Foreground="Maroon" FontFamily="Courier New" FontSize="24">Courier New 24</Run>
  <LineBreak/>
  <Run Foreground="Teal" FontFamily="Times New Roman" FontSize="18" FontStyle="Italic">Times New Roman Italic 18</Run>
  <LineBreak/>
  <Run Foreground="SteelBlue" FontFamily="Verdana" FontSize="14" FontWeight="Bold">Verdana Bold 14</Run>
</TextBlock>
</Canvas>

下图显示前面的 XAML 中呈现的格式化文本。

TextBlock 呈现多个 Run 对象

Sample of text formatting runs.

LineBreak 强制每个 Run 中的文本都显示为单独的一行。如果没有 LineBreak,每个 Run 中的文本将组合成为一行,并且通常由于超出 TextBlock 对象宽度或 Windows Phone 内容区域的宽度而被裁剪。下图显示在不使用 LineBreak 对象时,格式化文本将如何呈现。

不使用 LineBreak 对象的情况下呈现多个 Run 对象的 TextBlock

Sample text formatting runs.

在代码中访问 TextBlock 文本模型

实际有两个属性涉及 TextBlock 文本模型:TextInlines。不建议在运行时更改 Text 的值,因为它可能会展平单独的 Run 项上的任何现有的字体元素格式,以及为最初使用内联项而不只是 Text 构建的 TextBlock 剥离 LineBreak 元素。有关详细信息,请参阅 Inlines

文本换行

TextWrapping 属性声明文本在 TextBlock 中应该如何换行。默认情况下,TextBlock 中的文本不换行。如果不换行,根据其他设置,对文本可能会发生以下两种情况之一:

  • 如果 TextBlock 没有显式的 Width 集合,则 TextBlock 将基于其内的文本大小进行扩展,并且将更新 ActualWidth 的值。但是,TextBlock 始终位于其他一些容器父对象内,并且在布局父对象链之上的某个地方必然存在宽度约束。这将导致如果文本超出有效的布局约束宽度,文本将被裁剪。

  • 如果 TextBlock 具有显式的 Width 集合,则 TextBlock 本身将在文本超过固定 Width 时裁剪该文本。

若要使用文本换行,请将 TextWrapping 设置为枚举值 Wrap。例如,在 XAML 中:

<TextBlock Text="The quick red fox jumped over the lazy brown dog." TextWrapping="Wrap" />.

文本换行表现出下面的行为:

  • 如果 TextBlock 没有显式 Width 集合,则文本在有效的布局约束宽度换行。

  • 如果 TextBlock 具有显式的 Width 集合,则文本在固定的 Width 换行。

您可以通过编程方式检测到裁剪的文本,因为用于 TextBlockActualWidth 始终报告文本的扩展大小,甚至在它不适合于布局容器时也如此。如果您知道从哪里读取用于执行裁剪的布局容器的 Width,就可以比较这两个值。

下图演示了文本换行行为。

呈现不换行文本和换行文本的 TextBlock

Shows text getting cut off.
TextWrapping 如何影响 ActualWidth 和 ActualHeight

TextWrapping example.

有关更多信息,请参见 TextBlockTextWrapping

多行 TextBlock 文本

由于换行或者显式 LineBreak 元素,TextBlock 中的文本可能是多行文本。TextBlock 的以下两个属性影响多行文本的显示方式:LineHeightLineStackingStrategyLineHeight 设置每行内容在整体 TextBlock 中的高度。LineHeight 实际是基线间的高度;因此,如果您将 LineHeight 设置为小于 FontSize,则您的文本可能会在垂直尺寸上被截断。通常,您保留 LineHeight 未设置,并且依赖于一个默认行为;该行为基于 FontSize 加上偏移量呈现有效行高。如果使用默认算法,LineStackingStrategy 将影响该默认算法。LineStackingStrategy.MaxHeight(默认值)将有效行高基于字体中任何字符的最大高度。LineStackingStrategy.BlockLineHeight 将有效行高基于字体中也作为值存储的“块”字体设计度量。

将变换应用于 TextBlock 文本

变换可以改变应用程序中文本的显示。变换可应用于许多不同的 UI 元素,包括文本元素。对文本使用变换的一种情况是为了可以对变换执行动画处理,以便获得某一视觉效果。以下是一些可用于文本的变换:

在您将变换应用于文本时,应首先考虑是否存在使用特定的文本元素属性来得到同样或类似结果的其他方法。例如,如果某个字体系列支持斜体 FontStyle,则与应用 SkewTransform 相比,结果在视觉上更吸引人。

对 TextBlock 文本进行动画处理

可对许多文本属性值执行动画处理,包括 FontSize 的文本大小、通过 TranslateTransform 的位置和颜色。

对文本属性(尤其是大小或前景画笔)进行动画处理可能会占用大量系统资源。这是因为 Windows Phone 在呈现文本时会使用提示对每一文本标志符号进行平滑处理。如果对文本进行动画处理(通过使用 TransformFontSize),Windows Phone 将为每一框架提示标志符号,该操作开销很大,有可能导致删除框架。如果您的应用程序要求对大型文本进行动态缩放,最好使用以下两个选项之一:

Windows Phone 在其核心控件集中包括一个 TextBox 控件以及派生的 PasswordBox 控件。TextBox 通常用于捕获用户的文本输入。PasswordBox 通常用于身份验证方案。这两种控件之间的主要区别在于:在 TextBox 中键入的字符显示出来,而在 PasswordBox 中键入的字符显示为掩码字符。

TextBox 具有键盘焦点或当指针移至该控件上方时,光标通常变为一个 IBeam。此行为基于默认模板,并可以根据每个实例进行更改。

TextBox 文本换行

TextBox 控件支持文本换行。默认情况下,TextWrapping 属性设置为 NoWrap。在没有文本换行的情况下,如果输入的文本超出显式 Width 或父布局容器施加的宽度限制,则文本将滚动,以便光标始终保留在视图中。如果您将 TextWrapping 设置为 Wrap,则文本将不水平滚动,而是在 TextBox 内换行。如果超出了 HeightTextBox 的有效呈现高度,仍有可能产生输入文本不可见的情况。

多行 TextBox 文本

如果您将 AcceptsReturn 设置为 true,则 TextBox 可能会支持多行文本。在此模式中,ENTER/RETURN 键将作为新行记录。在此情况下,新行的任何输入字符都可能包括在 TextSelectedText 值中。

RichTextBox 是一个可支持您显示丰富内容(包括带格式的段落和内联图像)的控件。

本节介绍以某种方式与显示文本相关的其他控件。

Label

Label 是一个控件,它显示内容并能与另一控件关联。Label 派生自 ContentControl,并且还可以显示文本。Label 具有 Target 属性和对其与另一它引用的控件关联的自动化支持。通常 Label 只使用一个字符串作为 Content,但可以提供一个容器元素,以便更好地控制文本格式设置。Label 在 Windows Phone SDK 客户端库中提供。

ItemsControls

ItemsControl 具有使用内容显示器显示文本项的功能。这些项内的文本只是如字符串之类的文本,不支持单独的样式或文本对象模型。但是,您可以使用文本元素属性的属性值继承特性,对控件父对象上的值进行设置,然后应用于项文本。ComboBox 具有类似的功能(它也是 ItemsControl)。

Windows Phone 应用程序中一个非常常见的任务就是处理键盘输入。键盘输入在一般级别上由对 UIElement 实现的以下两个事件处理:KeyUpKeyDown。但是,您通常不使用这些特定的事件来处理特定文本元素或文本控件上的键或文本输入;而是使用特定于控件的事件。

TextBlock 在概念上是只读 UI 元素,因此用户不能直接更改文本。您也不能对 TextBlock 设置焦点,而元素上的焦点是产生任何键事件所必需的。

TextBox 用于用户输入,可接收焦点并且产生键事件。但是,TextBox 类具有针对 KeyUpKeyDown 的类级别处理。这意味着,如果您为这些键注册事件处理程序,例如注册 XAML <TextBox KeyDown="tb1_KeyDown" .../>,则您的处理程序偶尔不会被调用,因为 TextBox 类逻辑可能会在您的实例接收某一事件前将该事件标记为已处理。这是控件的目标设计的一部分。某些键不被视作文本,而是视作特定于控件 UI 行为。因此,KeyUp 键和 KeyDown 键不引发 TextChangedSelectionChanged 事件。

如果您遇到需要为来自 TextBox 或派生类的所有键情况专门处理 KeyUpKeyDown 事件的情况,即使您使用 AddHandler 方法附加处理程序,仍可以注册某一处理程序。

KeyUpKeyDown 事件是路由事件。这意味着,如果这些事件未由 TextBox 处理,它们可能在可视化树上向上冒泡,并且对后续父元素调用处理程序。有关 Windows Phone 中的路由事件的更多信息,请参见Windows Phone 8 的事件

通常,TextBox 用作双向数据绑定方案的一部分。TextBox.Text 是唯一的,这样它默认为只在 TextBox 失去焦点时更新目标,以免在用户完成文本输入前数据在每个用户键击时传播。有关双向绑定、更新机制和验证数据的更多信息,请参见Windows Phone 8 的数据绑定

Glyphs 类也用于显示文本。Glyphs 在比 TextBlockTextBox 更低的级别上处理文本;Glyphs 旨在在其文本内容中将每个标志符号作为可能的单独实体进行处理,从而能够单独控制块偏移量和其他特性。Glyphs 具有 UnicodeString 属性,而非 Text 属性。Glyphs 没有有效默认值,甚至对于字体系列或字号也没有。Glyphs 的用户需要为 FontUri 值打包字体文件子集。一般而言,在使用输出 Glyphs 可使用的低级别文本信息类型的工具时,针对 Glyphs 的模型最实用。

Glyphs 不被视为用于继承文本元素属性值的文本元素。由于 Glyphs 具有针对文本显示的不同方法,这导致没有任何 Glyphs 属性直接与字体元素属性(例如 FontFamilyFontSize)相符。

有关如何使用 Glyphs 类的更多信息,请参见 Glyphs

显示:
© 2014 Microsoft