WPF RichTextBox似乎添加了隐藏的填充

本文关键字:隐藏 填充 添加 RichTextBox WPF | 更新日期: 2023-09-27 18:20:44

这让我抓狂。我正在写一个文本荧光笔,它最终调用代码:

TextPointer caret = textBox.CaretPosition;
TextPointer contentStart = textBox.Document.ContentStart;
TextPointer highlightStart = contentStart.GetPositionAtOffset(startPosition + 1, LogicalDirection.Forward);
TextPointer highlightEnd = contentStart.GetPositionAtOffset(endPosition + 2, LogicalDirection.Forward);
textBox.Selection.Select(highlightStart, highlightEnd);
textBox.Selection.ApplyPropertyValue(textElementProperty, value);
textBox.Selection.Select(caret, caret);
textBox.CaretPosition = caret;

实际的代码本身运行良好。。。。一旦问题是,一旦它高亮显示,就好像RichTextBox在我的高亮显示周围添加了隐藏的填充,这样当我在文本上运行Regex时,Regex会返回正确的偏移量,但它不会正确映射到RichTextBox中的正确字母。例如,如果我要突出显示单词"狐狸",如:

那只敏捷的棕色狐狸跳过了那只懒狗。

"狐狸"这个词会被正确地突出显示,但如果我把"狗"改为狐狸,它会显示为:

快速的棕色狐狸跳过lazy fo公牛。

然而,删除第一个"狐狸"将更正后一个版本,使其显示为:

那只敏捷的棕色狗从懒惰的狐狸身上跳了过去。

这几乎就像RichTextBox添加了一些填充,我在进行文本扫描时无法解释这些填充。

更新

我找到了解决这个问题的办法。但是,这似乎只是进一步证实了我的怀疑。如果我反向应用着色,这似乎可以修复它,如:

protected override void TextChanged(TextChangedEventArgs args) {
    var matches = regex.Matches(base.Text)
        .Cast<Match>()
        .Select(match => new {
            Start = match.Index,
            End = match.Index + match.Length
        }).Reverse();
    foreach (var match in matches) {
        Colorize(match.Start, match.End, TextElement.ForegroundProperty, Brushes.Blue);
    }
}

看起来我不应该这么做。说真的,这看起来像是在添加填充物什么的。

WPF RichTextBox似乎添加了隐藏的填充

TextPointer API不仅计算字符,还计算符号,其中可以包括打开和关闭标记等http://msdn.microsoft.com/en-us/library/ms598662.aspx

因此,当你添加一些格式时,它会抛出你稍后在文本中保存的符号偏移。你必须从那里再次应用格式搜索等。或者反过来做也可以。