現在、キーワードを含む検索後に色付きの結果を生成しようとしています。私のコードは、検索エンジンによって正常にヒットしたテキストを含むリッチテキスト ボックスを表示します。
ここで、テキスト内のキーワードを太字にし、赤で色付けして強調したいと思います。私はこのようにブラウズする素敵な文字列テーブルに単語のリストを持っています (rtb は私の RichTextBox です。plainText は rtb からの唯一の Run であり、そのテキスト全体を含みます):
rtb.SelectAll();
string allText = rtb.Selection.Text;
string expression = "";
foreach (string word in words)
{
expression = Regex.Escape(word);
Regex regExp = new Regex(expression);
foreach (Match match in regExp.Matches(allText))
{
TextPointer start = plainText.ContentStart.GetPositionAtOffset(match.Index, LogicalDirection.Forward);
TextPointer end = plainText.ContentStart.GetPositionAtOffset(match.Index + match.Length, LogicalDirection.Forward);
rtb.Selection.Select(start, end);
rtb.Selection.ApplyPropertyValue(Run.FontWeightProperty, FontWeights.Bold);
rtb.Selection.ApplyPropertyValue(Run.ForegroundProperty, "red");
}
}
これでうまくいくと思いました。しかし、どういうわけか、最初の単語だけが正しく強調表示されます。次に、ハイライトの 2 回目の発生が 2 つ早く開始され、正しい量の文字がハイライトされますが、実際の単語の数文字前になります。次に、3 番目のオカレンスについては、さらに前の文字などです。
この動作の原因は何ですか?
編集 (2013 年 1 月 7 日): これらの結果がずらされている理由をまだ理解していません...これまでのところ、2 番目の foreach ステートメントの直前にゼロに設定された変数を作成すると、それを各テキストポインターの位置に加算してインクリメントすることに気付きました各ループの最後に 4 (理由はわかりません)、結果は適切に色付けされます。それにもかかわらず、2 つ以上のキーワードを検索すると (サイズが同じかどうかは関係ありません)、最初のキーワードの各出現は正しく色付けされますが、他のキーワードの最初の出現のみが適切に色付けされます。(他のものは再びずらされています)編集されたコードは次のとおりです。
rtb.SelectAll();
string allText = rtb.Selection.Text;
string expression = "";
foreach (string word in words)
{
expression = Regex.Escape(word);
Regex regExp = new Regex(expression);
int i = 0;
foreach (Match match in regExp.Matches(allText))
{
TextPointer start = plainText.ContentStart.GetPositionAtOffset(match.Index + i, LogicalDirection.Forward);
TextPointer end = plainText.ContentStart.GetPositionAtOffset(match.Index + match.Length + i, LogicalDirection.Forward);
rtb.Selection.Select(start, end);
rtb.Selection.ApplyPropertyValue(Run.FontWeightProperty, FontWeights.Bold);
rtb.Selection.ApplyPropertyValue(Run.ForegroundProperty, "red");
i += 4; // number found out from trials
}
}