2

現在、キーワードを含む検索後に色付きの結果を生成しようとしています。私のコードは、検索エンジンによって正常にヒットしたテキストを含むリッチテキスト ボックスを表示します。

ここで、テキスト内のキーワードを太字にし、赤で色付けして強調したいと思います。私はこのようにブラウズする素敵な文字列テーブルに単語のリストを持っています (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
    }
}
4

1 に答える 1

1

大丈夫!したがって、この質問を読んで、スタイルを変更するたびにテキストに 4 文字が追加されることを学びました。これが私の設定を台無しにしていたのです。

これを修正するには、複数のキーワードがあり、検索ボックスに入力された順序でテキストに次々と表示されない可能性があるため、最初にテキストを参照して、それぞれの出現箇所を見つける必要がありましたテキストを変更せずにキーワード。出現ごとに、出現位置の開始位置終了位置目的の色をカスタム リストに保存します。

この選択が完了したら、各メンバーのstart属性によってオカレンス リストを並べ替えます。foreachループでブラウズするたびに、その内容や長さに関係なく、テキスト内の次の出現が確実になるようになりました。また、どの色で表示したいかもわかっているので、さまざまなキーワードを区別できます。

そして最後に、順番付きリストの各メンバーをブラウズし、テキストのスタイルを変更できます。次の単語がテキストの後半に現れることがわかっているため、各ループの最後にインデックスに 4 文字を追加する必要があります。

于 2013-01-07T15:57:24.353 に答える