C# PictureBox.Paint事件持续触发

C# PictureBox.Paint事件持续触发,c#,winforms,events,graphics,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 R

我的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();
            }));
        }
    }
private void GamePictureBox\u Paint(对象发送方,PaintEventArgs e)
{
绘图(如图形);
}
公共空间绘图(图g)
{
锁(主块)
{
对于(int-RectsX=0;RectsX
{
GamePictureBox.Invalidate();
GamePictureBox.Update();
}));
}
}
GamePictureBox.Width和GamePictureBox.Height=601; MainBlock.RectSize.X和MainBlock.RectSize.Y=60.1f; 主要问题是,在DrawMap内的2个for循环完成后,Paint事件再次调用DrawMap!这一直在发生(无限循环),有点烦人。我尝试过调试,但我的调试技能只让我知道问题的原因是绘制事件

除了Paint事件之外,该事件不会被调用。

Invalidate()强制进行新的绘制,从而触发无限循环


在绘制事件中,应仅在图形上绘制,即不调用()

引用有关控制的MSDN文档。更新: “使控件在其客户端区域内重新绘制无效区域。”


引用有关Control.Paint事件的MSDN文档: “重画控件时发生。”

所以当你调用
GamePictureBox.Update()时触发新的绘制事件。

使用Invalidate+Update删除整个部分,这是在需要新渲染的内容发生更改时使用的(例如,在您的场景中,如果MainBlock.BlockColor发生更改,您将希望触发一个新事件)。

是您要求的,在绘制事件处理程序中调用Invalidate()。虽然使用Invoke()是一个相当严重的错误,因为它会将绘画变成一个高优先级的活动,阻止任何用户输入首先被处理,但在游戏应用程序中可能会有一定的用处。当你不喜欢单脚跳来跳去时,最好不要把你的腿打掉。虽然我以前尝试过对调用进行注释,但现在它已经起作用了。无法编辑上面的注释,因此:如果我移动windows窗体,Paint事件仍然会激活,这是正常的还是代码中的某些内容仍然会触发它(我对此深表怀疑)?