简单的应用程序开发可能不必要制作组件,C#中丰富的组件足以应对绝大多数的开发设想。
稍微复杂一些的应用开发,或者平台开发,或者团队开发,不可避免地要涉及到基础库的搭建,其中会有很多用户组件的设计与开发。
组件分可视化与非可视化,这里主要涉及的是可视化的组件。
可视化的组件一般分单一组件,就是继承自某一个单独的类,然后进行开发;复杂一些的就是继承自用户组件(windows窗体),这里可以完成丰富的功能。
一、简单的用户组件
比如我想制作一个按钮,当这个按钮获取焦点时显示一种(图片)状态,当这个按钮失去焦点时显示另外一种(图片)状态,当然可以设定更多的状态(鼠标按下),处理的方法类似,具体操作过程:
1、制作两张图片
2、 将两张图片放到项目(资源文件)中,这样编译时可以一起打包,不放也可以,需要在发行时随程序文件一起发行。
3、创建类UserButton.cs,编写代码
继承自PictureBox,然后编写具体的代码:
public partial class UserButton : PictureBox
{
private string imageNormal = "";
private string imageFocus = "";
public string ImageNormal
{
get { return imageNormal; }
set
{
imageNormal = value;
//设置正常显示时的图片
if (!string.IsNullOrEmpty(ImageFocus))
{
Image = Image.FromFile(imageNormal);
}
}
}
public string ImageFocus
{
get { return imageFocus; }
set
{
//设置按钮获取焦点时的图片
imageFocus = value;
}
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
//鼠标移入时更换显示图片
if (!string.IsNullOrEmpty(ImageFocus))
{
Image = Image.FromFile(imageFocus);
}
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
//鼠标移出,失去焦点时恢复默认的图片
Image = Image.FromFile(imageNormal);
}
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
//执行相应的动作
}
}
4、生成,如果没有错误,那么在工具箱中可以看到UserButton;
5、测试,在窗体中,放入一个UserButton,在窗体初始化中加入下面的代码即可看到效果:
userButton1.ImageFocus = "D:\\CSharp\\images\\IconSystemFocus.png";
userButton1.ImageNormal = "D:\\CSharp\\images\\IconSystemNormal.png";
二、复杂的用户组件
这里复杂的用户组件就是封装了很多的Windows组件或者用户组件,这些组件可以相互通讯也可以与外面的组件进行通讯,完成更多复杂的功能。
比如,完成一个搜索用户组件,用户组件上包含了一个文本框和一个自定义的按钮。具体的操作步骤如下:
1、新建用户组件UserSeach,选择基于“用户组件(windows窗体)”;
2、放置一个文本框(Textbox)和用户自定义组件(UserButton);
3、用户组件外面需要访问文本框和按钮,定义:
public UserButton MyUserButton {
get { return userButton1; }
}
public TextBox MyTextbox {
get { return textBox1; }
}
4、用户组件外面需要相应按钮点击事件,定义:
public event EventHandler MyUserButtonClicked;
private void userButton1_Click(object sender, EventArgs e)
{
//在用户组件内的响应处理;
MyUserButtonClicked?.Invoke(this,EventArgs.Empty);
}
5、生成,如果没有错误,那么在工具箱中会出现UserSeach用户组件;
6、在窗体中放入UserSeach用户组件,编写代码:
⑴在窗体中定义
UserButton mineUserButton;
TextBox mineTextbox;
⑵定义一个按钮事件响应:
private void UserSreach1_MyUserButtonClicked(object? sender, EventArgs e)
{
MessageBox.Show("响应代码");
}
⑶在窗体初始化时进行赋值与事件挂载:
mineUserButton = userSreach1.MyUserButton;
mineTextbox = userSreach1.MyTextbox;
mineUserButton.ImageFocus= "D:\\CSharp\\IconSystemFocus.png";
mineUserButton.ImageNormal = "D:\\CSharp\\IconSystemNormal.png";
userSreach1.MyUserButtonClicked += UserSreach1_MyUserButtonClicked;
7、可以看到正确的效果。
在1998年使用PowerBuilder时经常要用到自定义组件,有5种,非可视化的三种(单一的、复杂的,WatcomC编写的),可视化的两种(单一的、复杂的),制作自定义组件非常方便,不需要进行编译就可以使用,快捷便利,唯一注意点是不能在用户组件编辑时打开嵌套了用户组件的窗体或者组件。
组件内的控件与外界通讯也很方便,就是自定义一个中间事件作为桥梁,组件内控件触发这个中间事件,在窗体内应用时直接在中间事件内进行编写代码即可。