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);
}
}
看起来我不应该这么做。说真的,这看起来像是在添加填充物什么的。
TextPointer API不仅计算字符,还计算符号,其中可以包括打开和关闭标记等http://msdn.microsoft.com/en-us/library/ms598662.aspx
因此,当你添加一些格式时,它会抛出你稍后在文本中保存的符号偏移。你必须从那里再次应用格式搜索等。或者反过来做也可以。