为什么在XAML的TextBlock中添加阿拉伯语/波斯语文本格式会破坏组合字符?

3
在一个给定的单词中,我想展示一个或多个带有不同格式(例如不同颜色、更大的字体等)的波斯阿拉伯字母。但这会破坏组合字符。在以下3个项目中: 1)将单词包裹在<Span/>中并且它正确显示。 2)将单词的中间字母包裹在<Span/>中并且它正确显示。 3)将单词的中间字母包裹在<Span/>中并将其颜色更改为红色 - 它无法正确显示
        <TextBlock xml:lang="fa-IR" Language="fa-IR" FontSize="60" FlowDirection="RightToLeft">
            <TextBlock.Inlines>
                <Span Foreground="Yellow">حال</Span>
                ح<Span>ا</Span>ل
                ح<Span Foreground="Red">ا</Span>ل
            </TextBlock.Inlines>
        </TextBlock>

我使用的是WP8变体的XAML。有没有什么方法可以解决这个问题,使格式应用到文本上而不会破坏组合字符?


仅作为附注,这种情况不会发生在拉丁字母中,例如 hea<Span Foreground="Green">l</Span>th 可以正常工作。 - Todd Main
如果基于类似SL xaml的话,它会将换行符视为空格,就像在xml中一样。尝试将元素放在同一行上以避免空格。虽然我个人不熟悉在SL样式xaml中使用SPAN,而更倾向于使用<TextBlock><Run Text="blah" Foreground="Red"/><Run Text="blah" Foreground="Blue"/></TextBlock>。值得一试,由于我没有时间测试,所以作为注释而非答案输入。 - Chris W.
@ChrisW.,所有内容放在一行上的结果完全相同。我已经尝试过使用Runs、Spans、Runs/Spans中的所有内容,只有Runs/Spans中的格式化文本等等。一旦设置了格式,就没有任何作用。例如<Run Text="ح"/><Run Text="ا" Foreground="Red"/><Run Text="ل"/>(全部放在一行或每个Run放在单独的一行上)不起作用。然而<Run Text="ح"/><Run Text="ا"><Run Text="ل"/> 可以工作 - 唯一的区别是我从中间的<Run/>中删除了Foreground="Red" - Todd Main
很有趣,如果我有空的话,稍后我会试着玩一下,因为现在我很好奇。 - Chris W.
不是答案,但鉴于此事似乎是与Silverlight有关的问题。您的XAML在WPF中似乎可以正常工作,但在Silverlight(Web)和WP中却无法正常工作。 - keyboardP
1个回答

2

好的链接,但编写自己的ZWJ、ZWNJ等解决方案并不是一个真正的选项。你会看到类似的解决方案,比如https://dev59.com/qWcs5IYBdhLWcg3wYzH6,但是尝试过后,考虑每种情况的逻辑太多了。 - Todd Main
是的,你说得对。但似乎没有真正的解决方案存在。另一个解决方法是创建一个渲染字符的引擎,而不是使用WPF/SL。无法确定需要多少编码工作。 - Afshar Mohebi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接