0

重複の可能性:
リアルタイムでの RichTextBox 構文の強調表示 -- 再描画の無効化

RichTextBox コントロールを使用して、いくつかの単語の SelectionBackColor プロパティを見つけて変更しています。言葉は決まっていないので、基本的にBackColorの違う文章はバラバラです。

BackColor を新しい単語に適用する前に、前のテキストから BackColor をクリアする 2 つの方法を既に試しました。

  • すべてのテキストを選択し、SelectionBackColor を Controls BackColor に設定します。
  • テキストを文字列に保存し、それを RichTextBox に戻してフォーマットをクリアします。

どちらの方法も機能しますが、コントロールに大量のテキストがある場合に問題が発生します。最初の方法では、すべてのテキストが選択されていることがより明確になります (数ミリ秒で気付くことができます)。これは TextChanges イベントで発生するため、煩わしくなります。したがって、基本的に削除/追加されるすべての文字がこれをトリガーします。2 番目の方法については、最初の方法ほど明白ではありませんが、テキストが削除されてから挿入されるため、スクロールが少し奇妙になります。 SelectionBackColor のクリア。

これらすべての問題なしに、既存の SelectionBackColor をクリアするより良い方法があるはずです。特にこの場合、TextChanged イベントでクリーニングを行う必要があるためです。

あなたの考えを待っています。前もって感謝します。

編集:上記の最初の例(すべてを選択)で使用している方法を以下に示します。

private void ClearSelection(RichTextBox rtb)
{
    if (rtb.Text.Length > 0)
    {
        int currentIndex = rtb.SelectionStart;
        rtb.SelectAll();
        rtb.SelectionBackColor = Color.White;
        rtb.SelectionLength = 0;
        rtb.SelectionStart = currentIndex;
    }
}

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
    if (!_working)
    {
        ClearSelection(richTextBox1);
    }
}

_working bool は、プログラムが特定の単語の色を変更しているときにメソッドがトリガーされないようにするためのものであり、ユーザーがテキストを変更したときにのみトリガーされます。

Edit2:興味のある方は、RichTextBox で RTF をリセットしますか? トリックを行うようです。グラフィックの問題が発生するため、(何らかの奇妙な理由で)重複として投票されたものは避けます。

4

1 に答える 1

0

ダブルバッファリングを試しましたか?たぶん次のようなもの:

richTextBox1.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer,true);
于 2012-08-26T12:26:56.737 に答える