0

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

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. 例如,如果我要突出显示“狐狸”这个词,如下所示:

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

“狐狸”这个词会正确突出显示,但如果我将“狗”改为狐狸,它会显示如下:

敏捷的棕色狐狸跳过了懒惰的狐狸

然而,删除第一个“狐狸”将更正后一个版本,使其变为:

敏捷的棕色狗跳过了懒惰的狐狸

这几乎就像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);
    }

}

看来我不应该这样做。严重看起来像是在添加填充或其他东西。

4

1 回答 1

1

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

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

于 2013-07-03T04:41:15.577 回答