WPF RichTextBox自动合并相邻的Runs。

3

我有一个包含两个RunsRichTextBox:

<RichTextBox>
    <RichTextBox.Document>
        <FlowDocument>
            <FlowDocument.Blocks>
                <Paragraph Name="par">
                    <Run Text="First"/>
                    <Run Text="Second"/>
                </Paragraph>
            </FlowDocument.Blocks>
        </FlowDocument>
    </RichTextBox.Document>
</RichTextBox>

当我遍历parInlines时,我看到三个Runs:“First”、“ ”(空格)和“Second”。这很正常。但是,如果我删除第二个“ ”Run(例如使用Backspace键),然后遍历parInlines,我只看到一个“ FirstSecond ”RunRichTextBox将两个剩余的Runs合并为单个Run。但是,如果“First”和“Second”Runs具有不同的TextFontTextWeight值,RichTextBox将不会合并它们,我会看到两个不同的Runs:“First”和“Second”。
现在我的问题是:如何保留相邻的Runs不被RichTextBox自动合并?
我想要类似于当Runs具有不同的TextFontTextWeight值时的行为,但视觉上它们的格式应该相等。我尝试为不同的Runs设置不同的Tag值,但没有帮助。也许,有一些“逻辑”格式,它不影响Runs的外观,但警告RichTextBox区分它们。
1个回答

3
虽然我还没有找到明确的解决方案,但有一个解决方法。 RunTypography 属性,它又有一个 Int32 AnnotationAlternates 属性。该属性定义了特定字体的特定字符外观的微调。如果未按预期使用此属性,则可以将其用作 Run 的“逻辑”格式。如 MSDN 中所述:

如果 AnnotationAlternates 的值大于零且选定的字体不支持注释替代项,则显示字母的默认形式。

在我的应用程序中,我使用的是 Segoe UI 字体,结果发现它不支持注释替代项,因此这个解决方法对我有效。如果您使用支持注释替代项的字体,则可以尝试使用相当大的 AnnotationAlternates 属性值,也许不会影响文本的外观。

我使用了AnnotationAltenatives来克服这个问题。然而,当涉及到处理多种语言时,它成为了一个障碍。另一个选择是使用StylisticAlternatives。 - Naresh
另一种替代上述方法的方式是处理关键事件并删除文本,可以选择全部或逐个删除。这种方法在处理多种情况时非常繁琐,但是可行。 - Naresh

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