在构建WinForm程序中,为了使系统的结构清晰,有好的用户交互体验,实现不同按钮之间的交互,不使主窗体里面的代码臃肿。将按钮的命令通过类进行绑定,实现命令的管理使很有必要的。
该文章是将如何实现Button的按钮事件绑定的。
1、新建WinForm程序
2、添加3个Button按钮,如下图所示
3、新建ICommand.cs接口,代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace commandTest
{
//命令接口
public interface ICommand
{
void OnClick();
void New();
void Refresh();
}
}
4、新建命令管理类CommandUnitily.cs,代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace commandTest
{
class CommandUnitily
{
//创建命令集合
private static List<ICommand> cmds = new List<ICommand>(); //将命令添加到集合里面
public static void CmdRegist(ICommand cmd)
{
cmds.Add(cmd);
}
//刷新所有命令,用于命令直接的相互影响
public static void AllRefresh()
{
foreach (ICommand cmd in cmds)
{
cmd.Refresh();
}
}
}
}
5、新建Button按钮通用类ButtonTool.cs,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace commandTest
{
//button控件公用类,继承自ICommand接口
class ButtonTool : ICommand
{
private Button bt; void bt_Click(object sender, EventArgs e)
{
OnClick();
CommandUnitily.AllRefresh();//所有按钮都刷新,包括按钮本身
}
//使用virtual关键词之后,调用OnClick方法之后,
//会调用派生类(举例:Button1Click)中的OnClick,
//从而实现各自的button点击事件
public virtual void OnClick()
{
Console.WriteLine("点击button事件");
} public void New(Button but)
{
bt = but;
bt.Click += new EventHandler(bt_Click);
} public void Refresh()
{
Console.WriteLine(bt.Name+"刷新");
} public void New()
{
throw new NotImplementedException();
}
}
}
6、创建Button1Click.cs点击类,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace commandTest
{
//创建Button1事件执行类,继承自ButtonTool
class Button1Click : ButtonTool
{
public Button1Click(Button obj)
{
Console.WriteLine("button1注册成功");
this.New(obj);
}
//重写ButtonTool类的OnClick方法,用于实现Button1的点击事件
public override void OnClick()
{
base.OnClick();
Console.WriteLine("点击button1事件");
}
} }
7、主窗体Form.cs代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace commandTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
CommandUnitily.CmdRegist(new Button1Click(button1));
Console.WriteLine("窗体加载完毕");
}
}
}
8、文件结构如下:
9、测试
从窗体加载到点击button1测试的结果如下图:
可以借鉴Button1Click.cs类实现button2和button3的按钮点击事件