请原谅我讲了这么长的故事,但我认为这个问题值得。
我有一个我制作的自定义控件,它有自己的重写OnPaintBackground
方法,该方法使用成员Brush
和Pen
. 我是这样创建它的:
CustomControl c = new CustomControl();
c.Parent = someParent;
构造函数只是默认的,添加了一些用于创建画笔和钢笔以及背景的东西。
但是,我认为有一个带有父面板的构造函数会更好(因为我的控件不能在没有父面板的情况下使用)所以我向构造函数添加了一个参数:
public CustomControl(Control parent) {
InitializeComponent();
Parent = parent;
// do a bunch of stuff like getting brushes, pens, etc for drawing the background
}
然后当我运行我的程序时,第一个控件被创建并绘制得很好。然后对于第一个之后的所有控件,我得到了第一次机会异常,并且我的控件内System.Drawing.dll
所有面板的背景都是Winforms 在找不到图像或其他东西时显示的红色。请记住,要创建的控件的第一个实例运行良好。X
因此,我将我的 Visual Studio 设置为在引发任何异常时中断,而不是仅仅记录它,并且它在我的覆盖内的一行中中断OnPaintBackground
,如下所示:
e.Graphics.DrawLine(bPen, x, y, Width, Height);
有了信息Argument cannot be null
。所以我查看了调试器窗口,发现不仅是bPen
空的,而且我所有的画笔和钢笔以及所有东西都是空的,即使正在调用构造函数(使用 MessageBox 验证)!
我最终解决了这个问题,方法是从默认构造函数中删除参数并添加另一个带有参数的单独构造函数,并从该构造函数调用默认 ctor。但是,我想知道,对于没有默认构造函数的控件,C# 有什么让它们无法创建像Pen
s 这样的东西?