我想知道在windows窗体程序中覆盖OnPaint时应该什么时候调用base.OnPaint?
我正在做的是:
private void Form1_Paint(object sender, PaintEventArgs e)
{
// If there is an image and it has a location,
// paint it when the Form is repainted.
base.OnPaint(e);
}
我收到 stackoerflowexception,为什么?
最佳答案
您没有覆盖 OnPaint()
方法。您只是订阅了 Paint
事件,所以您不应该调用 base.OnPaint()
。
您应该(可以)仅在覆盖表单的 OnPaint()
方法时调用 base.OnPaint()
:
protected override OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// ... other drawing commands
}
Windows 窗体控件上的 OnPaint
方法实际上会引发控件的 Paint
事件并绘制控件表面。通过在 Paint
事件处理程序中调用基本表单的 OnPaint
方法,您实际上是在告诉表单一次又一次地调用 Paint
处理程序,并且所以您将陷入无限循环,因此会出现 StackOverflowException
。
当您覆盖控件的 OnPaint
方法时,通常您应该调用基方法,让控件自行绘制并调用订阅到 Paint
的事件处理程序事件。如果不调用基方法,一些控件方面不会被绘制,也不会调用事件处理程序。
关于c# - 当我们覆盖 OnPaint 时,我们什么时候应该调用 base.OnPaint()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9238914/