65.9K
CodeProject 正在变化。 阅读更多。
Home

Silverlight 1.1 希伯来语和阿拉伯语语言支持

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.05/5 (8投票s)

2008 年 1 月 31 日

Ms-PL

7分钟阅读

viewsIcon

45083

downloadIcon

320

一篇介绍 Silverlight 1.1 希伯来语和阿拉伯语语言支持的文章

介绍 - Silverlight 1.1 希伯来语和阿拉伯语语言支持

自从我开始在以色列从事 Silverlight 项目以来,我从每一位客户那里都收到了一个不变的要求——“我们需要希伯来语支持!”

因此,我们开发了一个 Silverlight 组件,实现了这一点——希伯来语和阿拉伯语的从右到左书写(Right-to-left)和右对齐(Align-to-right)支持。

正如我们所见——英文文本是左对齐的,并且是从左到右(LTR)书写的。
但希伯来语和阿拉伯语是右对齐书写的,并且是从右到左(RTL)书写的。

那么让我们来看看 Blend 中的“Hello World!”示例

image

(你可以看到所有文本都是左对齐的,并且是由操作系统而不是 Silverlight 格式化的。)

然而,在浏览器中运行 Silverlight 1.1 应用程序时,我们得到的是这个样子

image

什么???文本都乱了!
即使你不懂希伯来语和阿拉伯语,你也能看出这两个例子看起来不一样。

现在让我们看看使用我们新的 Silverlight 1.1 希伯来语和阿拉伯语语言支持后,文本正确渲染的样子

image

我们来总结一下刚才的比较

image

在没有我们的希伯来语和阿拉伯语支持的情况下,我们会得到这种奇怪的希伯来语、阿拉伯语和英语混合语法

image

说明和功能概述

  1. 设置 RTL 扩展器
  2. 对整个页面进行 RTL 和自动对齐

高级功能

  1. 对选定的 TextBlock 进行 RTL
  2. 对选定 Canvas 上的 TextBlock 进行 RTL
  3. 从 RTL 处理中排除 TextBlockCanvas
  4. 禁用 RTLExtender
  5. 自动对齐功能解释
  6. 强制所有 TextBlock 右对齐
  7. 切勿对经过 RTL 处理的 TextBlock 应用动画——只对父 Canvas 应用动画
  8. 切勿旋转经过 RTL 处理的 TextBlock——只旋转父 Canvas
  9. 使用 C# 代码对 TextBlock 进行 RTL 处理
  10. 以编程方式使用经过 RTL 处理的 TextBlock
  11. 更改 TextBlockTextWrapping 默认属性

设置 RTL 扩展器

  1. 此处下载二进制文件并解压出 DLL (JustinAngelNet.SilverlightRTL.DLL)。

    image

  2. 在 Expression Blend 2 September preview 中创建一个新的“Expression Blend Orcas”项目。

    clip_image001

    image

  3. 添加对 JustinAngelNet.SilverlighRTL.dll 的引用。(来自 JustinAngelNet.SilverlightRTL.zip

    image

  4. 打开 Expression Blend 资产库并选择 RTLExtender。(资产库 -> 自定义控件 -> RTLExtender)。

    clip_image004

    clip_image005

    image

  5. 将其放置在窗体上的任何位置(位置或大小都无关紧要)

    clip_image007

    clip_image008

对整个页面进行 RTL 处理

  1. 一旦将 RTLExtender 添加到窗体,所有 TextBlock 都将变为从右到左书写并右对齐。
  2. 只需向页面添加一个 TextBlock,并在其中写入一些内容。

    clip_image009

  3. 运行示例。

    clip_image010

对特定的 TextBlock 进行 RTL 处理

  1. 向我们的页面添加另一个包含希伯来语/阿拉伯语的 TextBlock

    clip_image011

  2. 给它起个名字。

    clip_image012

  3. 选择 RTLExtender 的属性。

    clip_image013

    clip_image014

  4. TargetTextBlocksName 中写入该 TextBlock 的 ID。

    clip_image015

  5. Tbx1 应该是这个 RTLExtender 唯一处理的 TextBlock

    clip_image016

  6. 你可以像这样指定多个特定的 TextBlock

    clip_image017

仅对特定 Canvas 上的 TextBlock 进行 RTL 处理

  1. 再向页面添加一个 TextBlock(到现在为止总共三个),并将其中两个组合到一个 Canvas 中。

    clip_image018

  2. 命名该 Canvas

    clip_image019

    clip_image020

  3. TargetCanvasesName 设置为我们的 Canvas 名称。

    clip_image021

  4. 只有嵌套在该 Canvas 上的 TextBlock 才会被 RTL 处理。

    clip_image022

从 RTL 处理中排除 TextBlock/Canvas

  1. 假设我们想对整个窗体进行 RTL 处理,但排除某些 CanvasTextBlock。我们可以使用 ExcludedTextBlocksName 来排除 TextBlock

    clip_image023

  2. 这样它将是窗体上唯一未被 RTL 处理的。

    clip_image024

  3. 如果我们想排除特定的 Canvas,也是同样的道理。

    clip_image025

  4. myCanvas 上的两个 Textblock 将不会被 RTL 处理,但页面上所有其他的都会。

    clip_image026

禁用 RTLExtender

  1. 嗯,这个非常直接。勾选“Disabled”将导致 RTLExtender 不进行任何 RTL 处理。

    clip_image027

  2. 结果

    clip_image028

自动对齐功能

  1. 向页面添加一个新的 TextBlock,写一个以希伯来语/阿拉伯语开头的句子,按 Enter 键,再写一个以英语开头的句子。

    clip_image029

    clip_image030

  2. 我会在 TextBlock 的边框上添加一个矩形,以便你更好地看到这个功能。

    clip_image031

  3. 运行示例,你可以看到所有以 RTL 语言开头的句子都右对齐,而其他的仍然是左对齐。

    clip_image032

  4. 同样的功能,但文本更多

    clip_image033

    • 第一句——以希伯来语开头 -> 右对齐。
    • 第二句——以英语开头 -> 左对齐。
    • 第三句——以希伯来语开头 -> 右对齐。
    • 第四句——以英语开头 -> 左对齐。

    clip_image034

强制所有句子右对齐(不基于首字符)

  1. ForceAllParagraphsAsRTL 设置为 true

    clip_image035

  2. 运行示例,所有段落都右对齐了。

    clip_image036

对 RTL 处理的 TextBlock 应用动画——仅在其父 Canvas 上

所有针对将被 RTL 处理的 TextBlock 的动画都必须应用在其父 Canvas 上,否则 RTLExtender 会抛出异常。

  1. 创建一个在页面加载时启动的新故事板。

    clip_image037

    clip_image038

  2. 选择一个将被 RTL 处理的 TextBlock,并以某种方式对其进行动画处理(比如我们来旋转它)。

    clip_image039

  3. 运行示例——什么也没发生。

    clip_image040

  4. 在 Visual Studio 中打开测试项目并从那里运行它。

    clip_image041

  5. 我们在 Visual Studio 2008 Beta2 中收到了一个错误消息,告诉我们不能直接在 TextBlock 上放置任何动画。
    我们应该将 TextBlock 组合到一个 Canvas 中。

    clip_image042

  6. 更改动画,使其指向 Canvas 而不是实际的 Textblock

    clip_image043

    变为

    clip_image044

  7. 重新运行示例,它将正确进行 RTL 处理。

    clip_image045

旋转经过 RTL 处理的 TextBlock——仅在其父 Canvas 上进行变换

不允许在将被 RTL 处理的 TextBlock 上使用 RotateTransform,否则 RTLExtender 会抛出异常。

  1. 我们来拿一个 TextBlock 并旋转它。

    clip_image046

  2. 如果我们在 Expression Blend 中运行示例,我们会得到未经 RTL 处理的文本

    clip_image047

  3. 如果我们在 Visual Studio 中运行示例,我们会得到以下异常

    clip_image048

  4. 让我们将 TextBlock 放在一个父 Canvas 内部,并旋转这个 Canvas

    clip_image049

    clip_image050

  5. 当我们运行示例时,我们得到了经过 RTL 处理的代码

    clip_image050

编程访问——通过代码对 TextBlock 进行 RTL 处理

  1. 我们可以使用 RTLExtender 以编程方式对特定的 TextBlock 进行 RTL 处理。(比如说,在包含的 TargetTextBlocksName 中的 TextBlock 或在运行时动态创建的 TextBlock)。

    clip_image052

  2. 正如我们所见,它在页面上没有被 RTL 处理

    clip_image053

  3. 我们将获取 RTLExtender 的引用(或创建一个新的),并调用 RTLTextBlock 方法。

    clip_image054

    clip_image055

  4. 当我们运行这段代码时,文本就被 RTL 处理了

    clip_image056

编程访问——使用一个经过 RTL 处理的 TextBlock

  1. 让我们运行这段代码

    clip_image057

    clip_image058

  2. 一个 TextBlock 经过 RTL 处理后,它就不再存在于 XAML 页面上了。

    clip_image059

    clip_image060

  3. 这是因为它被分割成了许多不同的 TextBlock,并从父元素的子集合中移除了。

    clip_image061

  4. 我们可以像这样获取替换了我们原始 TextBlockTextBlock 集合

    clip_image062

    clip_image063

  5. 当我们运行示例时

    clip_image064

包装一个 TextBlock

  1. 让我们向页面添加一个 TextBlock

    clip_image065

    clip_image066

  2. 现在让我们改变这个紧凑贴合的 TextBlock,使其宽度减小,高度增加(注意,没有添加换行符)。

    clip_image067

  3. 文本将由 RTLExtender 自动换行。

    clip_image068

  4. 我们可以将 TextBlock 设置为 TextWrapping.NoWrap,它将由普通的 Silverlight NoWrap 引擎处理

    clip_image069

    clip_image070

  5. 我们可以设置 TextWrapping.WrapWithOverflow,它会稍微超出 TextBlock 的边界。

    clip_image071

    clip_image072

问题、跟进和建议

Bug

你会在这个项目中发现 bug。
说真的,我还没那么聪明,能在 10 小时内重建希伯来语和阿拉伯语的 RTL 和右对齐支持。

请前往该项目的 Codeplex 页面这里,并创建一个新问题
写下你收到的错误,附上适当的、最简化的相关代码。
如果某些功能没有按你预期的方式工作,请告诉我你的预期是什么,以及实际发生了什么。

如果可能,请附上截图。

image

功能请求

此外,你可能需要额外的功能(比如让 RTLExtender 设置自己的字体并从服务器下载它们)。

同样,请创建一个新问题,我会尽力而为。

检查更新

这个项目在发布后的头 30-60 天内肯定会不断变化。
如果你正在使用这个项目,请订阅我们的 RSS 源以便接收通知。
RSS 源可以在这里找到。

如果你觉得 Codeplex 页面不够,这里是我的个人联系方式
电子邮件: J@JustinAngel.Net
手机: +972 546 567789
办公室: +972 3 9504364

我是认真的,请不要犹豫与我联系。

好了,差不多就是这些了。

历史

  • 发布于 The Code Project - 2008 年 1 月 31 日
  • 发布于 CodePlex - 2007 年 10 月 26 日
© . All rights reserved.