关于c#的事件如何使用

委托事件的详细使用

一、无参数,无返回的委托事件

委托事件类、事件的发生源

 1 public class Test
 2 {
 3     // ….
 4   public delegate void TestHandler();//无参数,无返回委托
 5   public event TestHandler TestEvent;//事件
 6   public void OnTestHandler()//调用
 7   {
 8     if(TestEvent != null) //不等于null 说明该事件已经注册有函数
 9     {
10       this.TestEvent();
11     }
12   }
13 }

调用触发事件方法(这里把注册和调用写在一起,实际可以把注册写在另外的类)

 1 class Program
 2 {
 3   static void Main(string[] args)
 4   {
 5     Test model = new Test();//实列
 6     model.TestEvent += model_TestEvent;//为model 注册TestEvent事件的执行方法
 7     model.OnTestHandler();//调用引发事件
 8   }
 9   static void model_TestEvent()//事件执行方法,该方法样式要与委托一致(参数,返回值)
10   {
11     Console.WriteLine("这是最简单的事件");
12   }
13 }

执行效果

补充1、

 1 model.TestEvent += model_TestEvent;//为model 注册TestEvent事件的执行方法,符合TestHandler委托样式(参数,返回值)的方法都可以进行注册,可注册多个函数,按顺序执行。如改为
 2 model.TestEvent += model_TestEvent1;
 3 //model.TestEvent += new Test.TestHandler(model_TestEvent1);也可以这样写
 4 model.TestEvent += model_TestEvent2;
 5 static void model_TestEvent1()
 6 {
 7   Console.WriteLine("这是事件的函数1");
 8 }//可设置断点看执行顺序
 9 static void model_TestEvent2()
10 {
11   Console.WriteLine("这是事件的函数2");
12 }

执行效果

补充2、

Main(string[] args)方法中我们进行了注册和调用,像观察者模式使用,就会把注册和调用进行分开。

注册类,也就是所谓的订阅类。该类也可以写成接口,给不同业务的监听者用来继承扩张,这里所有监听者都执行model_TestEvent()函数。

 1 public class Listeners
 2 {
 3   //注册
 4   public void registerEvent(Test model)
 5   {
 6     model.TestEvent += newTest.TestHandler(model_TestEvent);
 7   }
 8   //注销
 9   public void nullifyEvent(Test model)
10   {
11     model.TestEvent -= newTest.TestHandler(model_TestEvent);
12   }
13   public virtual void model_TestEvent()
14   {
15     Console.WriteLine("这是所有监听者要执行的函数");
16   }
17 }

这里原来是注册事件,现在改为实例,注册监听者。。

 1 static void Main(string[] args)
 2 {
 3   Test model = new Test();
 4   //可以实例注册多个监听者
 5   Listeners listener1 = new Listeners();
 6   Listeners listener2 = new Listeners();
 7   listener1.registerEvent(model);
 8   listener2.registerEvent(model);
 9
10   model.OnTestHandler(); //事件触发后,会向所有注册的监听者发送,所有监听者执行函数model_TestEvent
11 }

执行效果

二、带参数、返回值的委托事件

首先定义事件的参数,这是自定义事件传入的参数,从Eventargs继承,也可直接用Eventargs,这里为了简单就只给了个string字段,利用构造函数赋值。

1 public class TestEventArgs : EventArgs
2 {
3   public string parameters;
4   public TestEventArgs(string par)
5   {
6     parameters = par;
7   }
8 }

委托事件类

 1 public class Test
 2 {
 3   public delegate string TestHandler(object sender, TestEventArgs tea);//带参数,带返回的委托
 4   public event TestHandler TestEvent; //定义事件
 5   public string OnTestEvent(TestEventArgs tea)//调用
 6   {
 7     if (TestEvent != null)
 8     {
 9       return TestEvent(this,tea);
10     }
11     return null;
12   }
13 }

注册触发

 1 static void Main(string[] args)
 2 {
 3   Test model = new Test();
 4   model.TestEvent += model_TestEvent;//注册事件
 5   TestEventArgs tea = new TestEventArgs("test");//事件传入参数
 6   string result=  model.OnTestEvent(tea) ;//事件触发,得到结果
 7   Console.WriteLine(result);
 8 }
 9 static string model_TestEvent(object sender, TestEventArgs tea)
10 {
11   return "传入的参数是:" +tea.parameters ;
12 }

补充1、

这里注册和触发同样可以分开,前面的注册类中把model_TestEvent改为

 1 public virtual string model_TestEvent(objectsender,TestEventArgs tea)//事件执行函数
 2 {
 3   return "传入的参数是:" +tea.parameters;
 4 }
 5 class Program
 6 {
 7   static void Main(string[] args)
 8   {
 9     Test model = new Test();//实例
10     Listeners listener = new Listeners();//实例监听
11     listener.registerEvent(model);//注册
12     TestEventArgs tea = new TestEventArgs("test"); //事件参数
13     string result= model.OnTestEvent(tea);
14     Console.WriteLine(result);
15   }
16 }

补充2、

事件参数类型也可以封装,放在Test类内(OnTestEvent改为privte)。在Test类内加多

 1 public string InitEvent(string par)
 2 {
 3   TestEventArgs tea = new TestEventArgs(par);
 4   return OnTestEvent(tea);
 5 }
 6 Main就可以改为
 7 static void Main(string[] args)
 8 {
 9   Test model = new Test();
10   Listeners listener = new Listeners();
11   listener.registerEvent(model);//监听者注册到Test.这里如果很多不同业务的监听者的话,如何返回所有监听者处理完的信息。修改Listeners类?(单例,管理者类)。
12   string result = model.InitEvent("test");
13   Console.WriteLine(result);
14 }

完毕!多多指教。

时间: 2024-10-13 17:17:54

关于c#的事件如何使用的相关文章

移动端点击事件全攻略,有你知道与不知道的各种坑

看标题的时候你可能会想,点击事件有什么好说的,还写一篇攻略?哈哈,如果你这么想,只能说明你too young to simple. 接触过移动端开发的同学可能都会面临点击事件的第一个问题:click事件的300ms延迟响应.不能立即响应给体验造成了很大的困扰,因此解决这个问题就成为了必然. 这个问题的解决方案就是: zepto.js的tap事件.tap事件可以理解为在移动端的click事件,而zepto.js因为几乎完全复制jQuery的api,因此常常被用在h5的开发上用来取代jquery.

js监控微信浏览器的自带的返回事件

pushHistory(); window.addEventListener("popstate", function(e) { e.preventDefault(); //alert("我监听到了浏览器的返回按钮事件啦"); //根据自己的需求实现自己的功能 //window.location = 'http://www.baidu.com'; pushHistory(); }, false); function pushHistory() { var state

微信小程序学习总结(2)------- 之for循环,绑定点击事件

最近公司有小程序的项目,本人有幸参与其中,一个项目做下来感觉受益匪浅,与大家做下分享,欢迎沟通交流互相学习. 先说一下此次项目本人体会较深的几个关键点:微信地图.用户静默授权.用户弹窗授权.微信充值等等. 言归正传,今天分享我遇到的关于wx:for循环绑定数据的一个tips:  1. 想必大家的都知道wx:for,如下就不用我啰嗦了: <view class="myNew" wx:for="{{list}}">{{item.title}}<view

touchstart和touchend事件

touchstart和touchend事件 移动互联网是未来的发展趋势,现在国内很多互联网大佬都在争取移动这一块大饼,如微信及支付宝是目前比较成功的例子,当然还有各种APP和web运用. 由于公司的需要,最近也在开发移动web,对于一个没有移动开发经验的人来说,其实也是比较困恼的一件事情.对于移动web开发目前主要是基于webkit内核的浏览器.在webkit内核的环境下开发,你可以充分的运用html5+css3,还有它的一些私有属性.这让我很兴奋.可是,毕竟,对于一个长期习惯pc端做固定像素开

苹果手机输入中文不会触发onkeyup事件

今天同事的项目有这个问题,用我的安卓手机输入中文是ok的,但是苹果手机就不行 使用keyup事件检测文本框内容:  $('#keyup_i').bind('keyup', function(){         $('#keyup_s').text($(this).val());  } 本来是上面这种处理方式,现在改成下面这样就ok了 使用oninput以及onpropertychange事件检测文本框内容:  //先判断浏览器是不是万恶的IE,没办法,写的东西也有IE使用者       var

离散事件模型

0x01 代码框架逻辑 模拟内容: 1.离散事件模拟,模拟银行营业时的排队情况 2.不考虑顾客中途离开,顾客到达事件随机,业务办理时间 3.长度随机,选择最短的队排队,不再换队 代码逻辑: 1.一个事件链表,四个窗口排队队列 2.事件驱动:每有一个新的顾客到达,将产生下一个新顾客到达的新事件按时间顺序从小到大(OccurTime)插入事件链表(EventList) (如果此时窗口队列只有 一个顾客,还将产生此顾客离开事件插入事件链表中)      每有一个顾客从某一队列首离开,将产生他的后一位顾

zepto事件

1.zepto的定义 Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api 2.zepto与jq的区别 ①相同点:Zepto最初是为移动端开发的库,是jQuery的轻量级替代品,因为它的API和jQuery相似,而文件更小:zepto的API大部分都能和jQuery兼容,所以用起来极其容易 ②不同点: (1).针对移动端程序,Zepto有一些基本的触摸事件可以用来做触摸屏交互(tap事件.swipe事件) (2),Dom操作的区别:添加id时jQ

15.1-全栈Java笔记:Java事件模型是什么?事件控制的过程有哪几步??

应用前边两节上一章节的内容,大家可以完成一个简单的界面,但是没有任何的功能,界面完全是静态的,如果要实现具体功能的话,必须要学习事件模型. 事件模型简介及常见事件模型 对于采用了图形用户界面的程序来说,事件控制是非常重要的. 一个源(事件源)产生一个事件并把它(事件对象)送到一个或多个监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事件. 一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知. 每种类型的事件都有其自己的注册方法,一般形式为: v

RecyclerView动态添加、删除及点击事件

上一节讲解了RecyclerView的三种显示方式,本节将主要研究一下RecyclerView的动态添加.删除及其单击和长按事件的处理.我们在上一节代码的基础上进行相关操作. 一.修改适配器类MyAdapter,加入添加和删除这两个方法: public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private Context context; private List<String>

事件(1)

事件三要素 事件源:事件发生的来源 事件:行为(点击,触摸...) 监听器:当事件发送时,所要做的事情  onClickListener(单击事件) 组件.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { String str=et.getText().toString(); tv.setText(str); } }); 1 public class Click extends Ac