C# PictureBox.Paint事件持续触发
我的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
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事件仍然会激活,这是正常的还是代码中的某些内容仍然会触发它(我对此深表怀疑)?