自定义控件/组件的方法
1、在上一次的笔记中提到了自定义控件的方法,这种方法是自定义的Windows窗体控件库,最后在/Bin文件下生成的是.dll格式文件,将其拖到要使用项目的【工具箱】里就可以直接使用了。
2、本次将记录另一种自定义控件的方法,是在自己写好代码后,编译整个项目,可以直接在工具栏中看到它,没有dll文件,不需要自己添加到工具箱。
从使用上来看,第一种是专门写给别人用的又不想给别人看代码,则在建立项目时直接选择建立用户自定义控件。第二种则直接在项目里建立一个组件,方便维护代码。参考博客
自定义控件过程
第一步:新建窗体应用程序
第二步:在解决方案资源管理器,右键添加->用户控件
在资源管理器中就添加了控件了,如下面红框所示:
设计页面是这样的,然后就可以写自己的控件代码了:
如果需要添加类则可以同上面,添加->新建项->类
例子的整体结构是这样子的,其中控件代码在UserControl1中写,MyComman和DrawComman是控件需要用到的两个类,Form1中是写窗体代码的:
第三步:写好控件代码后,运行,则可以看到【工具箱】部分出现自定义组件,这时候就可以拖动到窗体使用了
遇到的问题
在自定义控件的时候,遇到一些问题,这里也记录一下(本次自定义控件的功能是画出坐标格,然后在Form程序中给随机数,通过定时器来实时画折线图):
1、写好代码,工具箱找中也成功添加后,拖动控件到窗口,控件什么也不显示,运行也是空白:
解决:问题出在自定义控件的初始化(在UserControl1.Designer.cs中),如下面所示,注释的是原来错误的,和正确的对比,少了SizeChanged和Paint,所以在运行时,控件并没有画坐标格。
private void InitializeComponent()
{
this.SuspendLayout();
//
// UserControl1
//
//this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
//this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
//this.Margin = new System.Windows.Forms.Padding(4);
//this.Name = "UserControl1";
//this.Size = new System.Drawing.Size(200, 188);
//this.ResumeLayout(false);
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Margin = new System.Windows.Forms.Padding(4);
this.Name = "UserControl1";
this.Size = new System.Drawing.Size(200, 188);
this.SizeChanged += new System.EventHandler(this.UserControl1_SizeChanged);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.UserControl1_Paint);
this.ResumeLayout(false);
}
更改后,从工具箱中拖动出来的控件可以正常显示:
2、例子还要实现实时画图的功能,但是运行后发现没有任何变化,因此思考是定时器的问题
解决:在Form1.Designer.cs中,定时器初始化有问题,刚开始不能正常工作是因为少了Tick。
// timer1
//
this.timer1.Enabled = true;
this.timer1.Interval = 1000;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick); //要加上这句