这让我疯了。我正在写一个文本荧光笔,最终调用代码:
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);
}
}
这似乎我不应该这样做。认真看起来它正在添加填充物等。
答案 0 :(得分:1)
TextPointer API不仅计算字符,还计算符号,其中包括打开和关闭标签等。请参阅MSDN上的备注部分,了解什么是计数符号 http://msdn.microsoft.com/en-us/library/ms598662.aspx
因此,当您添加一些格式时,它会抛出您稍后在文本中保存的符号偏移。您将不得不再次应用格式搜索等。或者反过来也可以。