PictureBox.Paint事件一直在触发

时间:2015-06-29 21:39:16

标签: c# winforms events graphics

我的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.RectSize.Y = 60.1f; 主要问题是在DrawMap中的2个for循环完成后,Paint事件再次调用DrawMap!这种情况一直在发生(无限循环),有点烦人。我已经尝试过调试但是我的调试技巧只让我知道问题的原因是Paint事件。

除了Paint事件之外,该事件被称为NOWHERE。

2 个答案:

答案 0 :(得分:2)

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

在Paint事件中,您应该只绘制图形,即没有Invoke()。

答案 1 :(得分:0)

在Control.Update上引用MSDN文档: &#34; 使控件重绘其客户区域内的无效区域。&#34;

在Control.Paint事件上引用MSDN文档: &#34; 重绘控件时发生。&#34;

因此,当您致电GamePictureBox.Update();时,您会触发一个新的Paint事件。 使用Invalidate + Update删除整个部分,这是在需要新渲染的更改内容时(在您的方案中,如果MainBlock.BlockColor已更改,例如,您想要触发新事件) )。