C# Invalidate()和Refresh()都不会调用OnPaint()

C# Invalidate()和Refresh()都不会调用OnPaint(),c#,winforms,C#,Winforms,我正试图以下面的代码从第1行转到第2行: using System; using System.Windows.Forms; namespace MyNameSpace { internal class MyTextBox : System.Windows.Forms.TextBox { protected override void OnEnabledChanged(EventArgs e) {

我正试图以下面的代码从第1行转到第2行:

using System;  
using System.Windows.Forms;  

namespace MyNameSpace  
{  
    internal class MyTextBox : System.Windows.Forms.TextBox  
    {  
        protected override void OnEnabledChanged(EventArgs e)  
        {  
            base.OnEnabledChanged(e);  
            Invalidate(); // Line #1 - can get here  
            Refresh();  
        }

       protected override void OnPaint(PaintEventArgs e)  
       {
            base.OnPaint(e);   
            System.Diagnostics.Debugger.Break(); // Line #2 - can't get here  
       }  
    }  
}  

但是,neiter Invalidate()或Refresh()似乎会导致调用OnPaint(PaintEventArgs e)。两个问题:

  • 为什么不起作用
  • 如果无法修复:我只想调用OnPaint(PaintEventArgs e)来访问e.Graphics对象——还有其他方法吗

  • 要替代控件的图形,必须将样式设置为UserPaint,如下所示:

    this.SetStyle(ControlStyles.UserPaint, true);
    
    有关更多信息,请参见此:

    UserPaint如果为true,控件将绘制 本身,而不是操作系统 系统正在这样做。如果为假,则为油漆 未引发事件。仅此款式 适用于从派生的类 控制


    编辑:读了克里斯的评论后,我同意你可能不应该使用这个


    要回答问题的另一部分,您可以通过以下方式获得任意控件的图形对象:

     Graphics g = panel1.CreateGraphics();
    
    但在执行此操作时,您还负责清理,因此正确的形式是:

      using (Graphics g = this.CreateGraphics())
      {
         // all your drawing here
      }
    

    但可能不应该这样做。检查此链接:
      using (Graphics g = this.CreateGraphics())
      {
         // all your drawing here
      }