c# - 当我们覆盖 OnPaint 时,我们什么时候应该调用 base.OnPaint()?

标签 c# winforms

我想知道在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/

相关文章:

winforms - 当绑定(bind)到组合框 SelectedItem 时,仅在失去焦点时才会通知更改。选择更改时如何通知?

c# - 我的 id 不为空,为什么会收到运行时错误?

c# - 如果使用 SqlServer CE 4.0 执行代码优先,数据库的位置是什么?

c# - 需要用于 MS UI 自动化的源代码 dll 的代码覆盖率信息

c# - 当 UpdatePanel 触发时,IE8 光标跳到文本区域的末尾

c# - 有没有一种简单的方法来获取选中列表框中特定项目的坐标?

c# - 从 Windows 窗体应用程序调用 Web API

c# - 当我期望相等的两个值不相等时抛出什么异常? (C#)

c# - 无法通过上下文(Entity Framework Core)将 unicode(表情符号)写入 SQL Server 表

c# - 用空格和#字符替换#字符