Silverlight-TextBlock换行-LineBreak

TextBlock 设定文字时,也可以使用较直觉的内部文字格式,而不使用明确的 Text 属性集,如以下范例:

Copy Code
<TextBlock>Hello, world!</TextBlock>
注意注意事项:

设定 Text 属性时并不会保留前置或尾端空白字元,只会保留内部空白字元。 如需以 XAML 处理空白字元的详细资讯,请参阅 XAML 概观

使用 Run 和 LineBreak 物件

TextBlock 并不会呈现单一字串,它也可以呈现不同 Run 项目中所包含的一系列字串,其中每一个项目可以拥有不同的字元层级字型属性。 LineBreak 物件表示 TextBlock 中的明确新行,而且通常用于周围 Run 项目之间。LineBreak Run 共用一个基础类别 (Inline),该类别能够让 TextBlock 保留其文字模型内容的强型别 InlineCollection。 该 InlineCollection 也是 TextBlock XAML 内容属性,只要将多个 Run LineBreak 项目 (Element) 指定为 TextBlock 的子项目 (Element),即可指定 TextBlock 模型中的项目 (Item)。

下列 XAML 范例示范如何在 TextBlock 中,借由使用 Run 物件定义数个不同格式的文字字串,以 LineBreak 分隔。

XAML
Copy Code
<!-- 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 rendering multiple Run objects

Cc189010.JOLT_run_in_xaml_01(zh-tw,VS.95).png

LineBreak 会强制每个 Run 中的文字换行,以显示为独立的一行。 如果没有使用 LineBreak,每个 Run 中的文字就会连成一行,最后会因为超过 TextBlock 物件宽度或是 Silverlight 内容区域的宽度而遭到裁剪。 下图显示格式化文字在没有使用 LineBreak 物件的情况下的呈现方式。

多个 Run 物件的 TextBlock 呈现方式:没有 LineBreak 物件的情况下

Cc189010.JOLT_run_in_xaml_02(zh-tw,VS.95).png

以程式码存取 TextBlock 文字模型

TextBlock 文字模型中实际包含两种属性:Text Inlines。 并不建议您一定要变更 Text 的值,因为它会造成个别 Run 项目 (Item) 上的任一字型项目 (Element) 变得扁平,而且会移除 TextBlock LineBreak 项目 (Element),这个项目原本是以内嵌项目形式建构,而且并不单纯的只是 Text。 如需详细资讯,请参阅 Inlines

文字换行

TextWrapping 属性 (Property) 宣告 TextBlock 中文字的换行方式。 依预设,TextBlock 中的文字不会自动换行。 因为没有换行,所以根据其他设定,文字可能发生下列其中一种情况:

  • 如果 TextBlock 没有明确设定 WidthTextBlock 会根据其中文字的大小而扩展,并且更新 ActualWidth 的值。 不过,TextBlock 一定会在某个其他的容器父项目中,而且会到达配置父项的链结 (Chain),此处也一定是宽度条件约束。 如果超过执行的配置条件约束宽度,则会导致文字被剪裁。

  • 如果 TextBlock 已明确设定 Width,则如果超过固定的 WidthTextBlock 会自行进行文字剪裁。

如果要使用自动换行,请将 TextWrapping 设定为列举值 Wrap。 例如,XAML 中的 <TextBlock Text="The quick red fox jumped over the lazy brown dog." TextWrapping="Wrap" />。 开启文字换行:

  • 如果 TextBlock 没有明确设定 Width,则文字会在目前执行的配置条件约速宽度的位置进行自动换行。

  • 如果 TextBlock 已明确设定 Width,则文字会在固定的 Width 位置进行自动换行。

因为 TextBlock ActualWidth 一定会回报文字已扩展的大小 (即使与配置容器不符也是如此) 所以您可以透过程式设计的方式侦测被剪裁的文字。 只要您确切知道在哪里读取执行剪裁之配置容器的 Width,便可以比较这两个值。

如需详细资讯,请参阅 TextBlock TextWrapping

未换行与换行文字的 TextBlock 呈现方式

Cc189010.LazyDog(zh-tw,VS.95).png
TextWrapping 对 ActualWidth 和 ActualHeight 的影响方式

Cc189010.NewWrap(zh-tw,VS.95).png

多行 TextBlock 文字

会因为自动换行或明确 LineBreak 项目这两种因素,TextBlock 中的文字,可能会以多行显示。 TextBlock 的下列两个属性会影响多行文字的显示方式:LineHeight 以及 LineStackingStrategy LineHeight 设定整体 TextBlock 中的每一行内容的高度。 LineHeight 其实是基准高度的基准,如此一来,如果您设定小于 FontSize LineHeight,文字可能会以垂直维度被切断。 通常,您会保留不设定 LineHeight,而仰赖,根据 FontSize 加上位移呈现有效文字行高度的预设值。如果使用 LineStackingStrategy,则它会影响预设的演算法。 LineStackingStrategy..::.MaxHeight (预设值) 会以字型中任一字元的最大高度做为有效文字行高度的基准。LineStackingStrategy..::.BlockLineHeight 会以「区块」字型设计度量 (也会储存为字型中的值) 做为有效文字行高度的基准。

套用转换到 TextBlock 文字

转换可改变您的应用程式中所显示的文字。 转换是一般的 UI 项目概念,适用于许多不同的类别,包括文字项目。 您会在文字上使用转换效果以及其他可能的使用案例包含下列:

RotateTransform,反转文字

ScaleTransform,用于大于字型中所继承之支援大小上限的文字

SkewTransform,用于切变或斜体模拟

TranslateTransform,用于位移与阴影效果

当您在文字中套用转换时,首先应该考虑是否还有其他方法可以使用文字项目属性而产生类似的效果。 例如,如果字型家旅支援斜体 FontStyle,那么比起套用 SkewTransform,它的结果在视觉上能够产生更吸引人的效果,或者,设定 FontSize 并使用字型启用的提示与特点时,比较在文字上设定 ScaleTransform,也可以获得较理想的效果。

您可能需要在文字上使用转换的一个使用案例是,您可以设定转换的动画,以产生视觉效果。

建立 TextBlock 文字的动画

许多文字属性 (Property) 的值可以建立成动画,包含 FontSize 的文字大小、透过 TranslateTransform 的位置和色彩。 如需哪些属性值类型支援动画的详细资讯,请参阅动画概观

将文字属性 (尤其是大小或前景笔刷) 建立成动画可能会耗用许多系统资源。 这是因为 Silverlight 在呈现文字时,会使用提示来使每个文字图像变平滑。 如果您建立文字大小的动画 (借由使用 Transform FontSize),则 Silverlight 会提示每个画面的图像,这是很耗费资源的,并可能会造成画面舍弃。 如果应用程式需要对大型文字进行动态缩放变更,则建议您使用下列其中一种替代方案:

利用LineBreak实现文本竖排:实做见 泡菜肉丝 的博客 http://www.cnblogs.com/JinDin/archive/2010/03/21/1691206.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章