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






4.05/5 (8投票s)
一篇介绍 Silverlight 1.1 希伯来语和阿拉伯语语言支持的文章
介绍 - Silverlight 1.1 希伯来语和阿拉伯语语言支持
自从我开始在以色列从事 Silverlight 项目以来,我从每一位客户那里都收到了一个不变的要求——“我们需要希伯来语支持!”
因此,我们开发了一个 Silverlight 组件,实现了这一点——希伯来语和阿拉伯语的从右到左书写(Right-to-left)和右对齐(Align-to-right)支持。
正如我们所见——英文文本是左对齐的,并且是从左到右(LTR)书写的。
但希伯来语和阿拉伯语是右对齐书写的,并且是从右到左(RTL)书写的。
那么让我们来看看 Blend 中的“Hello World!”示例
(你可以看到所有文本都是左对齐的,并且是由操作系统而不是 Silverlight 格式化的。)
然而,在浏览器中运行 Silverlight 1.1 应用程序时,我们得到的是这个样子
什么???文本都乱了!
即使你不懂希伯来语和阿拉伯语,你也能看出这两个例子看起来不一样。
现在让我们看看使用我们新的 Silverlight 1.1 希伯来语和阿拉伯语语言支持后,文本正确渲染的样子
我们来总结一下刚才的比较
在没有我们的希伯来语和阿拉伯语支持的情况下,我们会得到这种奇怪的希伯来语、阿拉伯语和英语混合语法
说明和功能概述
- 设置 RTL 扩展器
- 对整个页面进行 RTL 和自动对齐
高级功能
- 对选定的
TextBlock
进行 RTL - 对选定
Canvas
上的TextBlock
进行 RTL - 从 RTL 处理中排除
TextBlock
和Canvas
- 禁用
RTLExtender
- 自动对齐功能解释
- 强制所有
TextBlock
右对齐 - 切勿对经过 RTL 处理的
TextBlock
应用动画——只对父Canvas
应用动画 - 切勿旋转经过 RTL 处理的
TextBlock
——只旋转父Canvas
- 使用 C# 代码对
TextBlock
进行 RTL 处理 - 以编程方式使用经过 RTL 处理的
TextBlock
- 更改
TextBlock
的TextWrapping
默认属性
设置 RTL 扩展器
- 从此处下载二进制文件并解压出 DLL (JustinAngelNet.SilverlightRTL.DLL)。
- 在 Expression Blend 2 September preview 中创建一个新的“Expression Blend Orcas”项目。
- 添加对 JustinAngelNet.SilverlighRTL.dll 的引用。(来自 JustinAngelNet.SilverlightRTL.zip)
- 打开 Expression Blend 资产库并选择
RTLExtender
。(资产库 -> 自定义控件 -> RTLExtender)。 - 将其放置在窗体上的任何位置(位置或大小都无关紧要)
对整个页面进行 RTL 处理
- 一旦将
RTLExtender
添加到窗体,所有TextBlock
都将变为从右到左书写并右对齐。 - 只需向页面添加一个
TextBlock
,并在其中写入一些内容。 - 运行示例。
对特定的 TextBlock 进行 RTL 处理
- 向我们的页面添加另一个包含希伯来语/阿拉伯语的
TextBlock
。 - 给它起个名字。
- 选择
RTLExtender
的属性。 - 在
TargetTextBlocksName
中写入该TextBlock
的 ID。 Tbx1
应该是这个RTLExtender
唯一处理的TextBlock
。- 你可以像这样指定多个特定的
TextBlock
仅对特定 Canvas 上的 TextBlock 进行 RTL 处理
- 再向页面添加一个
TextBlock
(到现在为止总共三个),并将其中两个组合到一个Canvas
中。 - 命名该
Canvas
。 - 将
TargetCanvasesName
设置为我们的Canvas
名称。 - 只有嵌套在该
Canvas
上的TextBlock
才会被 RTL 处理。
从 RTL 处理中排除 TextBlock/Canvas
- 假设我们想对整个窗体进行 RTL 处理,但排除某些
Canvas
或TextBlock
。我们可以使用ExcludedTextBlocksName
来排除TextBlock
- 这样它将是窗体上唯一未被 RTL 处理的。
- 如果我们想排除特定的
Canvas
,也是同样的道理。 myCanvas
上的两个Textblock
将不会被 RTL 处理,但页面上所有其他的都会。
禁用 RTLExtender
- 嗯,这个非常直接。勾选“Disabled”将导致
RTLExtender
不进行任何 RTL 处理。 - 结果
自动对齐功能
- 向页面添加一个新的
TextBlock
,写一个以希伯来语/阿拉伯语开头的句子,按 Enter 键,再写一个以英语开头的句子。 - 我会在
TextBlock
的边框上添加一个矩形,以便你更好地看到这个功能。 - 运行示例,你可以看到所有以 RTL 语言开头的句子都右对齐,而其他的仍然是左对齐。
- 同样的功能,但文本更多
- 第一句——以希伯来语开头 -> 右对齐。
- 第二句——以英语开头 -> 左对齐。
- 第三句——以希伯来语开头 -> 右对齐。
- 第四句——以英语开头 -> 左对齐。
强制所有句子右对齐(不基于首字符)
- 将
ForceAllParagraphsAsRTL
设置为true
。 - 运行示例,所有段落都右对齐了。
对 RTL 处理的 TextBlock 应用动画——仅在其父 Canvas 上
所有针对将被 RTL 处理的 TextBlock
的动画都必须应用在其父 Canvas
上,否则 RTLExtender
会抛出异常。
- 创建一个在页面加载时启动的新故事板。
- 选择一个将被 RTL 处理的
TextBlock
,并以某种方式对其进行动画处理(比如我们来旋转它)。 - 运行示例——什么也没发生。
- 在 Visual Studio 中打开测试项目并从那里运行它。
- 我们在 Visual Studio 2008 Beta2 中收到了一个错误消息,告诉我们不能直接在
TextBlock
上放置任何动画。
我们应该将TextBlock
组合到一个Canvas
中。 - 更改动画,使其指向
Canvas
而不是实际的Textblock
。变为
- 重新运行示例,它将正确进行 RTL 处理。
旋转经过 RTL 处理的 TextBlock——仅在其父 Canvas 上进行变换
不允许在将被 RTL 处理的 TextBlock
上使用 RotateTransform
,否则 RTLExtender
会抛出异常。
- 我们来拿一个
TextBlock
并旋转它。 - 如果我们在 Expression Blend 中运行示例,我们会得到未经 RTL 处理的文本
- 如果我们在 Visual Studio 中运行示例,我们会得到以下异常
- 让我们将
TextBlock
放在一个父Canvas
内部,并旋转这个Canvas
。 - 当我们运行示例时,我们得到了经过 RTL 处理的代码
编程访问——通过代码对 TextBlock 进行 RTL 处理
- 我们可以使用
RTLExtender
以编程方式对特定的TextBlock
进行 RTL 处理。(比如说,在包含的TargetTextBlocksName
中的TextBlock
或在运行时动态创建的TextBlock
)。 - 正如我们所见,它在页面上没有被 RTL 处理
- 我们将获取
RTLExtender
的引用(或创建一个新的),并调用RTLTextBlock
方法。 - 当我们运行这段代码时,文本就被 RTL 处理了
编程访问——使用一个经过 RTL 处理的 TextBlock
- 让我们运行这段代码
- 一个
TextBlock
经过 RTL 处理后,它就不再存在于 XAML 页面上了。 - 这是因为它被分割成了许多不同的
TextBlock
,并从父元素的子集合中移除了。 - 我们可以像这样获取替换了我们原始
TextBlock
的TextBlock
集合 - 当我们运行示例时
包装一个 TextBlock
- 让我们向页面添加一个
TextBlock
。 - 现在让我们改变这个紧凑贴合的
TextBlock
,使其宽度减小,高度增加(注意,没有添加换行符)。 - 文本将由
RTLExtender
自动换行。 - 我们可以将
TextBlock
设置为TextWrapping.NoWrap
,它将由普通的 SilverlightNoWrap
引擎处理 - 我们可以设置
TextWrapping.WrapWithOverflow
,它会稍微超出TextBlock
的边界。
问题、跟进和建议
Bug
你会在这个项目中发现 bug。
说真的,我还没那么聪明,能在 10 小时内重建希伯来语和阿拉伯语的 RTL 和右对齐支持。
请前往该项目的 Codeplex 页面这里,并创建一个新问题。
写下你收到的错误,附上适当的、最简化的相关代码。
如果某些功能没有按你预期的方式工作,请告诉我你的预期是什么,以及实际发生了什么。
如果可能,请附上截图。
功能请求
此外,你可能需要额外的功能(比如让 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 日