-1

我有三个不同的事件:

form_load
button_click
pnlTiles_Paint

我的按钮单击事件有:

private void btnUpdate_Click(object sender, EventArgs e)
{
    pnlTiles.Paint += pnlTiles_Paint;
}

我的 form_load 事件有:

private void frmMain_Load(object sender, EventArgs e)
{
    pnlTiles.Paint += pnlTiles_Paint;
}

现在我的问题是,当我在 form_load 中使用它但在按钮事件中使用它时,会调用该事件;它只是跳过了事件,我在调试按钮单击时尝试进入事件。但是我在试图弄清楚为什么没有从按钮调用事件方面没有取得任何进展。

4

1 回答 1

4

正如其他人指出的那样,pnlTiles.Paint += pnlTiles_Paint;意味着您正在订阅Paint控件上的事件pnlTiles。这意味着每次pnlTiles引发Paint事件时,pnlTiles_Paint都会调用指定的方法。什么原因Paint被解雇?根据msdn

重绘控件时引发 Paint 事件。它将 PaintEventArgs 的实例传递给处理 Paint 事件的方法。

所以可能发生的事情是在主窗体引发事件之后引发pnlTiles事件(因为这是第一次在屏幕上绘制),这就是你的处理程序最终被调用的原因。PaintLoadpnlTiles

但是,单击按钮不会导致pnlTiles重绘和Paint引发事件,因此不会调用您的处理程序。

如果由于某种原因,在您将处理程序连接到Button's单击处理程序后,pnlTiles需要重新绘制,pnlTiles_Paint将被调用。pnlTiles.Invalidate()您可以通过在Button's订阅pnlTile's Paint事件后调用点击处理程序来测试这一点。

private void btnUpdate_Click(object sender, EventArgs e)
{
    pnlTiles.Paint += pnlTiles_Paint;
    pnlTiles.Invalidate();
}

由于您对事件的基础知识有些模糊,因此可能值得阅读这些文章:

Jon Skeet - 活动

MSDN - 事件

另外,请务必阅读 cgijbels 对这篇文章的评论,关于不要多次订阅同一个事件。

于 2013-10-01T21:50:50.270 回答