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#程序设计有一定的帮助。