C#采用Winform实现类似Android的Listener
本文实例讲述了C#采用Winform实现类似Android下Listener的方法。非常实用的一个技巧。具体实现方法如下:
首先是一个ICallBackListener接口,里面要写上你需要Listen的方法。
其次,是一个Controller类,类似于工作类,具体的功能可以在这里面实现。
实现代码如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading; namespaceListener { ///<summary> ///回调接口(类似Listener) ///</summary> publicinterfaceICallBackListener { voidonCallBack(); boolonCallBack(stringpWhat); } ///<summary> ///控制器类,处理事务 ///</summary> publicclassController { //执行任务的线程 privateThreadmThread; //控制循环和控制是否处理的Flag privateboolmFlagWhile; privateboolmFlagDoWork; //接收订阅Listener的回调的集合(Android中的vector) privateList<ICallBackListener>mListenerList; publicController() { //初始化Listener集合 mListenerList=newList<ICallBackListener>(); //初始化线程相关 mThread=newThread(work); mFlagWhile=true; mFlagDoWork=true; } ///<summary> ///具体执行的工作 ///</summary> privatevoidwork() { while(mFlagWhile) { Thread.Sleep(3000); if(mFlagDoWork) { //执行相应的处理 //具体处理的工作就在这里 ActiveOnCallBack(); } Thread.Sleep(3000); if(mFlagDoWork) { //执行相应的处理 //具体处理的工作就在这里 ActiveOnCallBack("Test"); } } } ///<summary> ///启动Controller处理 ///</summary> publicvoidStart() { if(mFlagWhile) mThread.Start(); } ///<summary> ///关闭Controller处理 ///</summary> publicvoidStop() { mFlagWhile=false; mFlagDoWork=false; mThread.Abort(); } ///<summary> ///激活onCallBack() ///</summary> privatevoidActiveOnCallBack() { if(mListenerList!=null) foreach(ICallBackListenertCallBackinmListenerList) { tCallBack.onCallBack(); } } ///<summary> ///激活onCallBack(string) ///</summary> ///<paramname="pWhat">传入的参数</param> privatevoidActiveOnCallBack(stringpWhat) { if(mListenerList!=null) foreach(ICallBackListenertCallBackinmListenerList) { tCallBack.onCallBack(pWhat); } } ///<summary> ///设置Listener ///</summary> ///<paramname="pCallBackListener">继承ICallbackListener接口的类</param> publicvoidsetOnListener(ICallBackListenerpCallBackListener) { if(pCallBackListener!=null) mListenerList.Add(pCallBackListener); } ///<summary> ///移除Listener ///</summary> ///<paramname="pCallBackListener">继承ICallbackListener接口的类</param> publicvoidremoveOnListener(ICallBackListenerpCallBackListener) { if(pCallBackListener!=null) mListenerList.Remove(pCallBackListener); } } }
接着就是如何使用这个类了,简单的创建一个Winform,一个Button用来停止,一个TextBox用来打印。
具体的用法里面都有注释!便于大家理解。
代码如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; usingListener; namespaceEventTest { //Form一定要继承ICallBackListener并实现其方法 publicpartialclassFormTest:Form,ICallBackListener { //UI更新委托 privatedelegatevoidDelegateTextBox(stringpString); //控制器 privateControllermController; publicFormTest() { InitializeComponent(); } privatevoidForm1_Load(objectsender,EventArgse) { //初始化控制器,设置侦听,并开始 mController=newController(); mController.setOnListener(this); mController.Start(); } //Override接口实现 publicvoidonCallBack() { //线程安全处理 if(InvokeRequired) { textBox1.Invoke(newDelegateTextBox(pushTextInTextbox),newobject[]{null}); } } //Override接口实现 publicboolonCallBack(stringpWhat) { //线程安全处理 if(InvokeRequired) { textBox1.Invoke(newDelegateTextBox(pushTextInTextbox),newobject[]{pWhat}); } returnfalse; } privatevoidbutton1_Click(objectsender,EventArgse) { //停止控制器 mController.Stop(); } ///<summary> ///接收委托的方法,该方法通过Invoke控制UI ///</summary> ///<paramname="pText">传入的string参数</param> privatevoidpushTextInTextbox(stringpText) { if(pText!=null) { textBox1.Text+="\n当前的处理:"+pText; } else { textBox1.Text+="\n空消息!"; } } privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse) { mController.Stop(); } } }
希望本文所述实例对大家C#程序设计有一定的帮助。