WPF 富文本框会自动合并两个相邻的运行



我有一个包含两个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:"第一","(空间(和"第二"。还行。但是如果我删除第二个" "Run(例如使用退格键(,然后遍历parInlines,我只看到一个"FirstSecond"RunRichTextBox将剩余的两个Runs合并为单个Run。但是,如果"第一"和"第二"Runs具有不同的TextFontTextWeight值,RichTextBox不会合并它们,我会看到两个不同的Runs:"第一"和"第二"。

现在我的问题:如何保护相邻的Runs不被RichTextBox自动合并?

我希望获得类似于Runs具有不同TextFontTextWeight值时的行为,但从视觉上看它们的格式应该是相同的。我尝试为不同的Runs设置不同的Tag值,但没有帮助。也许,有一些"逻辑"格式,不会影响Runs的外观,但警告 RichTextBox 区分它们。

虽然我还没有找到明确的解决方案,但有一个解决方法。 Run拥有Typography财产,而财产又拥有Int32 AnnotationAlternates财产。此属性定义对特定字体的特定字符的 Outlook 进行微调。如果未按预期使用此属性,则可以将其用作Run的"逻辑"格式。正如MSDN中所写:

如果"注释替代"的值大于零,并且 所选字体不支持注释替代,默认形式 的信件将显示。

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

最新更新