这让我发疯了。我正在编写一个文本荧光笔,最终调用代码:
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);
}
}
看来我不应该这样做。严重看起来像是在添加填充或其他东西。