2つのエクステントコントロールがあります。 最初にLiveControl
と呼ばれ、サイズ変更、回転、移動、...メソッドを持つPictureBox
から継承されています。 第2のものは、Panel
から継承されたDrawPanel
と呼ばれ、複数のLiveControl
の親であることを意図しています。winformのすべてのコントロールを無効にすると、OnPaintメソッドが無期限に呼び出されます
LiveControl
が別のものの上を移動したときに、フィラーリングを減らしたり、トレイルを残すためにいくつかのことを行いました。
MouseUp += (s, e) =>
{
foreach (Control c in Parent.Controls.OfType<LiveControl>())
c.Refresh();
};
MouseMove += (s, e) =>
{
if (e.Button == MouseButtons.Left)
{
Control x = (Control)s;
x.SuspendLayout();
x.Location = new Point(x.Left + e.X - cur.X, x.Top + e.Y - cur.Y);
x.ResumeLayout();
foreach (Control c in Parent.Controls.OfType<LiveControl>())
c.Update();
}
};
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
foreach (Control c in Parent.Controls.OfType<LiveControl>())
c.Invalidate();
}
しかし、問題は、上記のコードのように、各
LiveControl
の
OnPaint
が
LiveControl
秒のすべてを無効に、それは無限の原因となるということです。そして最終的に私は
LiveControl
で、次のコードで予想以上に、それはさらに良く達成しました
OnPaint
の呼び出しは、フォーム上の他のコントロールに問題を引き起こします(遅延が非常に遅くなります)。この問題を解決するには
私はこのようなOnPaint
のコードに編集:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (!((DrawPanel)Parent).Invalidating)
{
((DrawPanel)Parent).Invalidating = true;
((DrawPanel)Parent).InvalidatedCount = 0;
foreach (Control c in Parent.Controls.OfType<LiveControl>())
c.Invalidate();
}
else
{
((DrawPanel)Parent).InvalidatedCount++;
if (((DrawPanel)Parent).InvalidatedCount == ((DrawPanel)Parent).Controls.OfType<LiveControl>().Count())
{
((DrawPanel)Parent).InvalidatedCount = 0; ((DrawPanel)Parent).Invalidating = false;
}
}
}
をしかしOnPaint
方法はまだノンストップと呼ばれています。 誰かがこれを解決する方法を知っていますか?
downvoter、あなたはなぜそう言いたいですか? –
OnPaintイベントでペイントイベントをデタッチしようとし、タスクを完了した後に、コントロールで再び登録します。無限ループから克服するのに役立ちます。 –
@NiranjanKala OnPaintイベントをデタッチすると、Invalidate()何でもいい。 –