2

入力された特定の単語を強調表示するカスタム RichTextBox に取り組んでいます。 (スペースで区切られていない文字列を強調表示するつもりなので、特定の文字列を強調表示するようなものです)

テキストをメモリにロードして文字列を検索し、文字列のリストを 1 つずつ検索してから、書式設定を適用します。

問題は、フォーマットが適用されたときに、プレーンテキスト表現から取得したインデックスが、必ずしも 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);
    }
}

文字列インデックスをリッチ テキスト ボックスのコンテンツにマップするにはどうすればよいですか?

注:現時点では、これのパフォーマンスについて心配していませんが、提案はいつでも歓迎されます.

4

0 に答える 0