PictureBox.Paint事件持续发生

本文关键字:Paint 事件 PictureBox | 更新日期: 2023-09-27 18:00:20

我的PictureBox.Paint事件一直在发生,我不知道是什么原因导致的。

    private void GamePictureBox_Paint(object sender, PaintEventArgs e)
    {
        DrawMap(e.Graphics);
    }
    public void DrawMap(Graphics g)
    {
        lock (MainBlock)
        {
            for (int RectsX = 0; RectsX < GamePictureBox.Width - 1; RectsX += (int)MainBlock.RectSize.X)
                for (int RectsY = 0; RectsY < GamePictureBox.Height - 1; RectsY += (int)MainBlock.RectSize.Y)
                    g.DrawRectangle(MainBlock.BlockColor, RectsX, RectsY, MainBlock.RectSize.X, MainBlock.RectSize.Y);
            Invoke((MethodInvoker)(() =>
            {
                GamePictureBox.Invalidate();
                GamePictureBox.Update();
            }));
        }
    }

GamePictureBox.Width和GamePictureBox.Height=601;MainBlock.RectSize.X和MainBlock.RctSize.Y=60.1f;主要问题是,在DrawMap内的2个for循环完成后,Paint事件再次调用DrawMap!这种情况一直在发生(无限循环),有点烦人。我试过调试,但我的调试技能只让我知道问题的原因是Paint事件。

该事件称为NOWHERE,而不是"绘制"事件。

PictureBox.Paint事件持续发生

Invalidate()强制执行一个新的Paint,从而触发无限循环。

在"绘制"事件中,应仅在图形上绘制,即不绘制Invoke()。

引用Control.Update上的MSDN文档:"使控件在其客户端区域内重新绘制无效区域。"

引用有关Control.Paint事件的MSDN文档:"在重新绘制控件时发生。"

因此,当调用GamePictureBox.Update();时,将触发一个新的"绘制"事件。使用Invalidate+Update删除整个部分,这是在需要新渲染的内容发生更改时使用的(例如,在您的场景中,如果MainBlock.BlockColor发生更改,则需要触发新事件)。