3

私はこの機能を持っています:

private void clearRichtextBox()
{
    richTextBox2.Clear();
    foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords)
    {
        for (int i = 0; i < kvp.Value.Count(); i++)
        {
            richTextBox2.AppendText("Url: " + kvp.Key + " --- " + "Localy KeyWord: " + kvp.Value[i]+Environment.NewLine);
        }
    }   
}

それを実行しているところClear();は、richTextBoxがミリ秒程度点滅/点滅しているように見えます。それを止めるのを避ける方法はありますか?

4

5 に答える 5

2

RichTextBoxテキストが変更されるたびに少なくとも 1 つの再描画をキューに入れるという の固有の動作を回避することはできませんが、提供したコード スニペットでは、clear を呼び出す代わりに、帯域外でテキストを準備するように設定できます。これにより、通常の操作を変更することなく、視覚活動の変化量を最小限に抑えることができます。さらに、KeyValue セットのビューと同じ内容を保持したいようです。

に適用する前に を使用しStringBuilderてテキストを組み立て、違いがある場合RichTextBoxはプロパティを割り当てます。Textの内容に変更がない場合、RichTextBoxすべてが再描画されるわけではありません。これが、表示されている点滅動作の原因です。

private void clearRichtextBox()
{
    StringBuilder sb = new StringBuilder();

    foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords)
    {
        for (int i = 0; i < kvp.Value.Count(); i++)
        {
            sb.AppendFormat("Url: {0} --- Localy KeyWord: {1}{2}", kvp.Key,kvp.Value[i],Environment.NewLine);
        }
    }

    string viewString = sb.ToString();
    if(viewString != richTextBox2.Text)
    {
         richTextBox2.Text = viewString;
    }
}
于 2012-10-14T22:40:25.460 に答える
1

それはまさにそれがどのように機能するかです。フォームでダブルバッファリングを有効にしてみてください。

this.DoubleBuffered = true;

もう1つの方法は、RichTextBoxコントロールを継承し、そのNew()メソッドをオーバーライドしSetStyle()て、コントロール自体のダブルバッファリングを有効にすることです。

この方法でこれを行う方法:

public class MyRichTextBox : RichTextBox {

    protected override void New() {
        base.New();
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    }
}

次に、次の手順を実行する必要があります。

  1. デザイナーウィンドウを閉じる
  2. デザイナーファイルを開く
  3. RichTextBox2回をに置き換える必要がありMyRichTextBoxます。1つは宣言されたファイルの上部に近く、もう1つは初期化されたファイルの下部に近くです。
  4. デザイナ/テストを保存して再度開きます
于 2012-10-14T22:22:28.950 に答える
0

これも役立つかもしれません:

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/a6abf4e1-e502-4988-a239-a082afedf4a7

SendMessage を使用して、コントロールの再描画モードをオン/オフします。

于 2012-10-14T22:28:38.620 に答える
0

点滅するかどうかは試していませんが、RTB の値を空の文字列に設定することもできます。

richTextBox2.Text = "";
foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords)
{
    for (int i = 0; i < kvp.Value.Count(); i++)
    {
        richTextBox2.AppendText("Url: " + kvp.Key + " --- " + "Localy KeyWord: " + kvp.Value[i]+Environment.NewLine);
    }
} 
于 2012-10-14T22:32:03.513 に答える