2

我正在开发一个自定义 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 事件上运行它以突出显示“作为用户类型”并且它变得有点迟钝。

4

0 回答 0