新建网站怎么做,wordpress缓存图片,氧os哪个网站做的最好,沪尚茗居官网上海概述事件属于委托的一个子集#xff0c;像我们平时界面上的鼠标点击按钮后响应事件、事件的发布和订阅等都需要用到委托.通过委托可以很好的实现类之间的解耦好。事件委托EventHandler的函数原型如下#xff1a;delegate 表示这个个委托#xff0c;事件委托没有返回值#…概述 事件属于委托的一个子集像我们平时界面上的鼠标点击按钮后响应事件、事件的发布和订阅等都需要用到委托.通过委托可以很好的实现类之间的解耦好。事件委托EventHandler的函数原型如下delegate 表示这个个委托事件委托没有返回值有两个入参sender是事件触发的对象e是一个泛型的事件类型参数public delegate void EventHandlerTEventArgs(object sender, TEventArgs e);用法举例用法举例1窗体关闭事件public void Cancel(object obj, bool e){if (e){sw.AppendLine(try clsoe window);}else{sw.AppendLine(clsoe window is cancel);}}//事件委托1事件是委托的子集EventHandlerbool windowTryClose Cancel;windowTryClose(this, false);这里在定义了一个委托EventHandlerbool将方法Cancel委托给他然后嗲用委托执行。注意EventHandlerbool windowTryClose Cancel;是
EventHandlerbool windowTryClose new EventHandlerbool(Cancel);的简写传入的参数是false所以运行结果clsoe window is cancel用法举例2 按钮点击事件//事件委托2Button button new Button();button.ClickEvent Button_Click;button.ClickAction();public void Button_Click(Object sender, EventArgs args){sw.AppendLine(这是按钮点击事件);}public class Button{public EventHandler ClickEvent;public void ClickAction(){ClickEvent.Invoke(this, new EventArgs());}}这里主要是写了按钮点击事件的一个委托一般在定义事件委托时前面可以用event去修饰我这里省略了用法举例3 事件发布与订阅//事件委托3var myPublishEventArgs new PublishEvent();_ new SubscribeEvent(myPublishEventArgs);myPublishEventArgs.Publish();public class MyPublishEventArgs : EventArgs{public string InfoString { get; set; }}public class PublishEvent{public event EventHandlerMyPublishEventArgs OnPublish;public void Publish(){OnPublish?.Invoke(this, new MyPublishEventArgs() { InfoString hello });}}public class SubscribeEvent{public SubscribeEvent(PublishEvent publishEvent){publishEvent.OnPublish Subscribe;}public void Subscribe(Object sender, MyPublishEventArgs args){MessageBox.Show($我接收到的消息是:{args.InfoString});}}这里封装了几个类MyPublishEventArgs是我要发送的事件MyPublishEventArgs这个类是发布者SubscribeEvent这个是订阅者主要订阅事件一定要放在发布前这样才能成功接收到事件.委托部分这里就讲解完事了全部源码如下using PropertyChanged;
using System;
using System.Text;
using System.Threading;
using System.Windows;namespace Caliburn.Micro.Hello.ViewModels
{[AddINotifyPropertyChangedInterface]public class DelegateViewModel : Screen,IViewModel{public string ResultString { get; set; }delegate int DelegateM(string a, string b);//声明,可以有返回值也可以没有StringBuilder sw new StringBuilder();public DelegateViewModel(){DisplayName DelegateTest;}public void Test(){sw.AppendLine($【Delegate测试】执行线程id:{Thread.CurrentThread.ManagedThreadId});//func用法1//Funcstring, string, int func new Funcstring, string, int(p.StringAddA);Funcstring, string, int func StringAddA;//简写var result func.Invoke(3, 5);//可以简化为func(3, 5)sw.AppendLine($【func用法1】func返回结果是:{result});//func用法2用lamda表达式简化写法,通过注册实现多播委托func (a, b) {return int.Parse(a) - int.Parse(b);};sw.AppendLine($【func用法2】func返回结果是:{func(3, 5)});//Action用法//Actionstring, string action new Actionstring, string(p.StringAddB);Actionstring, string action StringAddB;//简写IAsyncResult asyncResult action.BeginInvoke(3, 5, null, null);//action(3, 5),BeginInvoke异步执行即开启新现成处理StringAddBaction.EndInvoke(asyncResult);//阻塞委托直到执行完成if (asyncResult.IsCompleted){sw.AppendLine($【Action用法】当前异步委托线程已执行完成);}Test(func, action);//将方法委托后转化为参数进行传递//delegate用法//DelegateM delegateM new DelegateM(p.StringAddA);DelegateM delegateM StringAddA;//简写sw.AppendLine($【delegate用法】delegate返回结果是:{delegateM(3, 5)});//事件委托1事件是委托的子集EventHandlerbool windowTryClose new EventHandlerbool(Cancel);windowTryClose(this, false);//事件委托2Button button new Button();button.ClickEvent Button_Click;button.ClickAction();//事件委托3var myPublishEventArgs new PublishEvent();_ new SubscribeEvent(myPublishEventArgs);myPublishEventArgs.Publish();ResultString sw.ToString();}public int StringAddA(string a, string b){return int.Parse(a) int.Parse(b);}public void StringAddB(string a, string b){sw.AppendLine($【Action用法】Action执行线程id:{Thread.CurrentThread.ManagedThreadId});sw.AppendLine($【Action用法】Action执行结果:{(int.Parse(a) int.Parse(b))});}public void Test(Funcstring, string, int f, Actionstring, string a){a.Invoke(f.Invoke(3, 5).ToString(), 5);}public void Cancel(object obj, bool e){if (e){sw.AppendLine(try clsoe window);}else{sw.AppendLine(clsoe window is cancel);}}public void Button_Click(Object sender, EventArgs args){sw.AppendLine(这是按钮点击事件);}public void MyEvent(Object sender, EventArgs args){sw.AppendLine(这是按钮点击事件);}}public class Button{public EventHandler ClickEvent;public void ClickAction(){ClickEvent.Invoke(this, new EventArgs());}}public class MyPublishEventArgs : EventArgs{public string InfoString { get; set; }}public class PublishEvent{public event EventHandlerMyPublishEventArgs OnPublish;public void Publish(){OnPublish?.Invoke(this, new MyPublishEventArgs() { InfoString hello });}}public class SubscribeEvent{public SubscribeEvent(PublishEvent publishEvent){publishEvent.OnPublish Subscribe;}public void Subscribe(Object sender, MyPublishEventArgs args){MessageBox.Show($我接收到的消息是:{args.InfoString});}}
}运行结果