0

私のコードでは、パネルの「フレーム」として長方形を描画しています。XMLファイルから必要な色を文字列として取得しています(「赤」、「青」など)。パネルを作成している間、私はこのコードを使用してそれをペイントしています:

                    Strip.Paint += (sender, e) =>
                {
                    //MessageBox.Show(clr.ToString());
                    Pen p = new Pen(Color.FromName(color), 2); // color is the string with name of the color
                    Rectangle r = new Rectangle(1, 1, 286, 36);
                    e.Graphics.DrawRectangle(p, r);
                    p.Dispose();
                    e.Dispose();
                };

長方形を更新することになっているメソッドで、この行を追加します

Strip.Refresh();

これは正常に機能します。しかし、30秒ごとにタイマーを使用して、色が変更されたかどうかを確認し、変更された
場合は、要求された色で長方形を再描画します。最初の長方形は正しく描画されます。しかし、タイマーが30に達すると、それはただ...まあ、それをどのように説明するかさえわかりません。これが「リフレッシュ」後の動作の写真です。 テキストを除く、更新前後のアプリケーションのPrintscreen

4

1 に答える 1

2

「赤十字」は、OnPaintメソッド内で例外がスローされたときに発生するものです。Paintこれは、ラムダ内のコードにバグがあることを意味します。

例外がスローされると、内部フラグが設定され、コントロールはそれ自体を再描画しようとしなくなります。これは、アプリケーションが再度実行されたとき、またはこのトリックが実行されたときにのみリセットされます。

私はあなたの場合の問題はあなたがイベントでオブジェクトに想定されていないことDispose()だと知っていると思います。PaintEventArgsPaint

一般に、自分で作成していないオブジェクトを破棄する必要はありません。

于 2012-12-30T14:57:50.980 に答える