我正在开发一个自定义的RichTextBox,它突出显示在其中键入的某些单词。 (更像是突出显示某些字符串,因为我打算突出显示未用空格分隔的字符串)
我通过将文本加载到内存中,逐个查找字符串列表,然后对它们应用格式来搜索字符串。
问题是,当应用格式时,从纯文本表示获得的索引不一定指向RichTextBox内容中的相同位置。
(首先格式化是完美的。任何后续格式化都会向左滑动。我认为这是因为格式化会在文档中添加某些元素,导致我的索引不正确。)
此示例伪代码如下。
// get the current text
var text = new TextRange(Document.ContentStart, Document.ContentEnd).Text;
// loop through and highlight
foreach (string entry in WhatToHighlightCollection)
{
var currentText = text;
var nextOccurance = currentText.IndexOf(suggestion); //This index is Unreliable !!!
while (nextOccurance != -1)
{
// Get the offset from start. (There appears to be 2 characters in the
// beginning. I assume this is document and paragraph start tags ??
// So add 2 to it.)
int offsetFromStart = (text.Length) - (currentText.Length) + 2;
var startPointer = Document.ContentStart.
GetPositionAtOffset(offsetFromStart + nextOccurance, LogicalDirection.Forward);
var endPointer = startPointer.GetPositionAtOffset(suggestion.Length, LogicalDirection.Forward);
var textRange = new TextRange(startPointer, endPointer);
textRange.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.Yellow));
textRange.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
textRange.ApplyPropertyValue(TextElement.FontFamilyProperty, new FontFamily("Segoe UI"));
// Go to the next occurance.
currentText = currentText.Substring(nextOccurance + suggestion.Length);
nextOccurance = currentText.IndexOf(suggestion);
}
}
如何将字符串索引映射到富文本框内容?
注意:我现在并不担心这种情况的表现,虽然欢迎提出任何建议,因为目前我在每个TextChanged事件上运行此操作以突出显示“作为用户类型”它变得有点迟钝了。