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

use*_*813 11 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)  
        {  
            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  
       }  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

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

  1. 为什么不起作用?
  2. 如果无法修复:我只想调用OnPaint(PaintEventArgs e)来访问e.Graphics对象 - 有没有其他方法可以做到这一点?

Nib*_*Pig 13

要覆盖控件的绘图,必须将样式设置为UserPaint,如下所示:

this.SetStyle(ControlStyles.UserPaint, true);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle.aspx

UserPaint如果为true,则控件将自行绘制而不是操作系统.如果为false,则不会引发Paint事件.此样式仅适用于从Control派生的类.