如何在WPF RichTextBox中使用字符串索引突出显示文本?

时间:2012-10-03 11:40:43

标签: c# wpf formatting wpf-controls richtextbox

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

0 个答案:

没有答案