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

时间:2013-07-03 02:30:50

标签: c# wpf richtextbox

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

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中的正确字母。例如,如果我要强调“狐狸”这个词,如:

快速的棕色狐狸跳过懒狗。

“狐狸”这个词会被正确地突出显示,但如果我要将“狗”变成狐狸,它就会显示出来:

快速的棕色狐狸跳过了 y 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);
    }

}

这似乎我不应该这样做。认真看起来它正在添加填充物等。

1 个答案:

答案 0 :(得分:1)

TextPointer API不仅计算字符,还计算符号,其中包括打开和关闭标签等。请参阅MSDN上的备注部分,了解什么是计数符号 http://msdn.microsoft.com/en-us/library/ms598662.aspx

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