C#环境中自定义控件的实现与应用
C#环境下自定义控件的实现是比较简单的,下面给出一简单控件的实现方法,所谓麻雀虽小五脏俱全,复杂控件的实现同简单控件的实现是大同小异。
下面给出UserControl1.cs的全部代码
二、自定义控件的引用
一、自定义控件的编写
这里我给出一个能实现通过选择颜色对话框里的颜色实现字体颜色改变的控件,效果如下图。
下面给出实现的步骤:
(1),新建项目模版中选择“windows控件库”
(2),把UserControl1的Name属性修改为“myStatusBar”,并如下设置控件的布局
其中,PictureBox1、PictureBox2、label1和Panel控件的Dock属性分别为Top,Buttom,Left,Fill。并为PictureBox1和PictureBox2控件加载两幅图片。
(3),在UserControl1.cs类中写代码
[System.Drawing.ToolboxBitmap(@"D:\Office2003Icons\常用图标\(12,15).png")]//设置控件的图标,放置的位置为类的前面
这句代码是用来设置控件的图标,如果不写这一句,则系统会用其默认的图标,这里需要注意的是这句代码一定要放置在myStautsBar类的前面,代码组织如下图。
(4),接着为自定义控件设置自己的专有属性myText,用于设置label的文本内容,代码写在myStatusBar类中
public string mystrText;
[Description("为状态栏设置要显示的文字")]//在控件的属性列表中显示的属性描述
public string myText//在控件属性列表中显示的属性名,这个属性其实就是设置label1的文字内容
{
get { return mystrText; }
set
{
mystrText = value;
label1.Text = value;
}
}
public string myText//在控件属性列表中显示的属性名,这个属性其实就是设置label1的文字内容
{
get { return mystrText; }
set
{
mystrText = value;
label1.Text = value;
}
}
其实这个时候控件就可以单独应用了,这是一个只含有一个自定义属性的控件,按F5运行这个项目,弹出“用户控件测试容器”,可以看到里面有myText属性,当我们点击它的时候下面会有我们自己写的属性提示说明,在其中输入文字,发现控件中的文字也随之改变了。
继续添加第二个属性myFontColor属性,用于设置字体的颜色,代码写在myStatusBar类中
public Color mycolor;
[Description("为状态栏中文字设置颜色")]
public Color myFontColor
{
get { return mycolor; }
set
{
mycolor = value;
label1.ForeColor = value;
panel1.BackColor = value;
}
}
public Color myFontColor
{
get { return mycolor; }
set
{
mycolor = value;
label1.ForeColor = value;
panel1.BackColor = value;
}
}
运行之后,效果图如下
是不是发现多了一个myFontColor属性,原来自定义控件也就这样,没有想象中那么难,是的。
(5),下面我们要做的事情就稍微复杂点了,为控件写自己的事件,就像button有Click,MouseMove和MouseDown事件一样,我们要为自己的控件写专门的事件,步骤如下:
(Ⅰ),写一个事件的委托(或者叫代理,关键字delegate),代码写在myStatusBar类中
public delegate void FontColorChangedEventHandler(object sender, FontColorChagedEventArgs e);//事件所需的委托。委托相当于可以实例化一个事件的类,委托中的参数必须同其委托的事件参数完全一致。
注意:这里的FontColorChagedEventArgs类为继承自EventArgs类的一个自定义子类,后面会给出其具体实现的代码。并且委托的命名规则为:事件名(FontColorChanged)+EventHandler。里面的两个参数命名规则:第一个为sender,类型为object,第二个为e,类型为自定义类,事件名(FontColorChanged)+EventArgs。
(Ⅱ),定义一个事件,这个事件需要(I)中所定义的委托作为代理,代码写在myStatusBar类中
public event FontColorChangedEventHandler FontColorChanged;//定义一个FontColorChangedEventHandler事件。事件就是一个委托实例,可以想象成实例化一个类。
注意:这里事件不带任何参数。
(Ⅲ),定义一个方法,通过这个方法来触发(II)中定义的事件,代码写在myStatusBar类中
public virtual void OnFontColorChanged(FontColorChagedEventArgs e)//定义一个虚函数(或者叫方法),虚函数的作用是在它的子类中可以用关键字override重写这个函数。
{
if (FontColorChanged != null)
{
FontColorChanged(this, e);//通过虚函数来实现FontColorChanged事件
}
}
if (FontColorChanged != null)
{
FontColorChanged(this, e);//通过虚函数来实现FontColorChanged事件
}
}
(Ⅳ)把事件同控件关联,代码写在myStatusBar类中
private void panel1_Click(object sender, EventArgs e)//把我们所写的事件同我们自定义的控件进行关联起来
{
Color cc;
ColorDialog cd = new ColorDialog();//打开一颜色对话框
if (cd.ShowDialog() == DialogResult.OK)
{
cc = cd.Color;
panel1.BackColor = cc;
label1.ForeColor = cc;
OnFontColorChanged(new FontColorChagedEventArgs(cc));//这里调用虚函数,其实就是变相地触发FontColorChanged事件
}
}
Color cc;
ColorDialog cd = new ColorDialog();//打开一颜色对话框
if (cd.ShowDialog() == DialogResult.OK)
{
cc = cd.Color;
panel1.BackColor = cc;
label1.ForeColor = cc;
OnFontColorChanged(new FontColorChagedEventArgs(cc));//这里调用虚函数,其实就是变相地触发FontColorChanged事件
}
}
(Ⅴ)现在写我们以上步骤频繁用到的自定义类FontColorChagedEventArgs,代码写在myControl命名空间中
public class FontColorChagedEventArgs : EventArgs//这是一个继承自System .EventArgs的一个自定义类
{
public Color pColor;
public FontColorChagedEventArgs(Color c)//带有参数的构造函数
{
pColor = c;
}
public Color get_color//属性,这个属性用于在颜色改变时返回当前的颜色
{
get { return pColor; }
}
}
public Color pColor;
public FontColorChagedEventArgs(Color c)//带有参数的构造函数
{
pColor = c;
}
public Color get_color//属性,这个属性用于在颜色改变时返回当前的颜色
{
get { return pColor; }
}
}
到这里整个自定义控件的代码就写完了,F5运行
在E:\myControl\myControl\bin\Debug目录下生成一名为myControl.dll的dll文件,这就是我们的自定义控件的引用集(或者成为库)。
下面给出UserControl1.cs的全部代码
UserControl1.cs代码
二、自定义控件的引用
(1),新建一windows应用程序,名为“testControl”。在在工具箱上右击鼠标,选择“选择项(I)…”打开“选择工具箱项”对话框,在”.NET Framework组件“选项卡中选择浏览,加载刚刚编译好的myControl.dll文件。在工具箱中我们发现多了一个名为myStatusBar的控件,没错这就是我们自己写的一个控件,还带有自己定义的图标。
(2),拖拽myStatusBar控件至Form1中,设置好其myText和myFontColor属性后。我们发现在其事件列表中存在一名为FontColorChanged的事件,相信你已经发现这其实就是我们自己写的事件。
在其FontColorChanged事件中写代码获取当前的颜色,并用消息框显示出来
private void myStatusBar1_FontColorChanged(object sender, myControl.FontColorChagedEventArgs e)
{
Color c;
c = e.get_color;//这是一个在FontColorChagedEventArgs的类中写好的一个属性
MessageBox.Show("颜色为:" + c.Name);
}
Color c;
c = e.get_color;//这是一个在FontColorChagedEventArgs的类中写好的一个属性
MessageBox.Show("颜色为:" + c.Name);
}
到此,一个简单自定义控件的编写及应用已经完成。