开发拥有自定义事件的控件(二)

版权声明:本文为博主原创文章,转载请注明出处: https://blog.csdn.net/IntegralforLove/article/details/83143453

可统计单击次数的自定义按钮

 .NET Framework提供了拥有丰富特性的可视化控件,给开发带来了很大的方便。但这些控件都是针对通用场景设计的,在实际开发中,往往需要一些拥有特定功能的控件,人们通常选择在已有控件的基础上加以组合或扩充以得到这些“新的”自定义控件,毕竟完全从零开始开发不是一件简单的事情。

        在Windows Form中,从头开始定义一个Windos Form控件需要了解很多的底层技术,其工作量相当可观。所以,应尽量选择从现有控件中派生,或者组合现有控件为一个新控件。

        本例所开发的这个按钮,是一个可复用的Windows用户控件,名为“MyCustomButton”。它是一个可统计单击次数的自定义按钮,它提供一个自定义的MyClick事件,在其事件参数中提供按钮单击次数的信息。它的基类是现有的Button类,做出这一决定的原因是我们只是想着扩充现有按钮的功能,并不想完全“从头”开始定义一个全新的按钮控件。

1.使用Visual Studio创建一个Windows窗体控件库项目MyCustomButton。向项目中添加一个新的组件类,命名为MyCustomButton.cs。

自定义控件类其继承于现有的Button类:

public partial class MyCustomButton : System.Windows.Forms.Button

2.定义事件参数类型

事件所携带的信息被封装到了事件参数中。依据.NET编程规范,事件参数应该从EventArgs派生,其命名方式为“事件名 + EventArgs”:

public class MyClickEventArgs : EventArgs
{
    public int ClickCount = 0;		//封装的事件信息:按钮被单击的次数
    public MyClickEventArgs(int ClickCountValue) : base()
    {
        ClickCount = ClickCountValue;
    }
}

注意自定义事件参数的构造函数应该调用基类的构造函数。

3.定义事件委托。

依据.NET事件处理规范,事件委托的命名方式为“事件名 + EventHandler”,并且应该拥有两个参数:第一个参数是事件源,第二个参数则是前面所定义的事件参数类的实例。

 public delegate void MyClickEventHandler(object sender, MyClickEventArgs e);

4.声明事件。

使用event关键字定义MyClick事件:

 public event MyClickEventHandler MyClick;

5.重写基类的OnClick方法,激发MyClick事件。

依据.NET事件处理规范,所有Windows控件定义的事件都在一个相应的“On事件名”方法中触发,由于需要将标准的鼠标点击(Click)事件“转换”为一个新的自定义事件,因此需要重写Button的OnClick方法:

public int ClickCount{ get; private set;}    //单击计数器  自动实现的属性	
protected override void OnClick(EventArgs e)	
{
    base.OnClick(e);		//调用基类OnClick方法,保证标准Click事件得以触发
    ClickCount++;		//计数器加一
    if (MyClick != null)
    {
        MyClick(this, new MyClickEventArgs(ClickCount));		//触发MyClick事件
    }
}

        编译项目之后,可以在Visual Studio的工具箱中看到自定义的按钮控件(MyCustomButton)图标。现在可以从工具箱中将MyCustomButton控件拖到窗体上,采用与标准Button一样的方式进行界面设计,而在属性窗口中,也可以看到自定义事件MyClick的身影。

6.给MyClick事件添加响应方法

既可以直接在属性窗口双击“MyClick”事件,也可以在窗体的构造函数中手动给MyClick事件添加响应方法:

private void myCustomButton2_MyClick(object sender, MyCustomButton.MyClickEventArgs e)
{
    MessageBox.Show(e.ClickCount.ToString());   //弹出消息框,显示当前按钮的按键次数
}

7.也可以通过自定义控件myCustomButton读取属性的方式,获取当前按钮的按键次数。

private void myCustomButton1_Click(object sender, EventArgs e)
{
    MessageBox.Show(myCustomButton1.ClickCount.ToString());
}

猜你喜欢

转载自blog.csdn.net/IntegralforLove/article/details/83143453