我的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。
答案 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已更改,例如,您想要触发新事件) )。