永远不会调用OnPaint覆盖

Cie*_*iel 17 c# winforms

我已经在这几天了,这让我很生气.我有一个继承自System.Windows.Forms.Panel的控件,我试图覆盖OnPaint.它很简单,直截了当地发出它.

public class CollapsiblePanel : System.Windows.Forms.Panel
{
  public CollapsiblePanel()
  {
   //
   // Required for the Windows Form Designer
   //
   InitializeComponent();

   //
   // TODO: Add any constructor code after InitializeComponent call
   //
   SetStyle
    (
     ControlStyles.AllPaintingInWmPaint | 
     ControlStyles.UserPaint      | ControlStyles.DoubleBuffer   |
     ControlStyles.ResizeRedraw     | ControlStyles.Selectable ,
     true
    );
        }

  protected override void OnPaint(PaintEventArgs e)
  {
            // This never runs no matter what I try!
            base.OnPaint(e);
        }
}
Run Code Online (Sandbox Code Playgroud)

小智 21

当我尝试覆盖OnPaint时,我对ProgressBar也有同样的问题.它从未被调用过.


我在这里找到了解决方案:http://web.archive.org/web/20140214234801/http : //osix.net/modules/article/?id = 826

您必须创建一个构造函数并启用用户绘制,如下所示:

SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
Run Code Online (Sandbox Code Playgroud)

默认值可能因框架版本和操作系统而异.

  • @Stacey:是的,枚举是位标志,逻辑上对它们进行枚举的顺序并不重要.无论您指定它们的顺序如何,`SetStyle`方法都会获得相同的标志组合. (5认同)