入力された特定の単語を強調表示するカスタム 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);
}
}
文字列インデックスをリッチ テキスト ボックスのコンテンツにマップするにはどうすればよいですか?
注:現時点では、これのパフォーマンスについて心配していませんが、提案はいつでも歓迎されます.