C#采用Winform实现类似Android的Listener
程序员文章站
2023-12-22 11:22:04
本文实例讲述了c#采用winform实现类似android下listener的方法。非常实用的一个技巧。具体实现方法如下:
首先是一个icallbacklistener接...
本文实例讲述了c#采用winform实现类似android下listener的方法。非常实用的一个技巧。具体实现方法如下:
首先是一个icallbacklistener接口,里面要写上你需要listen的方法。
其次,是一个controller类,类似于工作类,具体的功能可以在这里面实现。
实现代码如下:
using system; using system.collections.generic; using system.linq; using system.text; using system.threading; namespace listener { /// <summary> /// 回调接口(类似listener) /// </summary> public interface icallbacklistener { void oncallback(); bool oncallback(string pwhat); } /// <summary> /// 控制器类,处理事务 /// </summary> public class controller { // 执行任务的线程 private thread mthread; // 控制循环和控制是否处理的flag private bool mflagwhile; private bool mflagdowork; // 接收订阅listener的回调的集合(android中的vector) private list<icallbacklistener> mlistenerlist; public controller() { // 初始化listener集合 mlistenerlist = new list<icallbacklistener>(); // 初始化线程相关 mthread = new thread(work); mflagwhile = true; mflagdowork = true; } /// <summary> /// 具体执行的工作 /// </summary> private void work() { while (mflagwhile) { thread.sleep(3000); if (mflagdowork) { // 执行相应的处理 // 具体处理的工作就在这里 activeoncallback(); } thread.sleep(3000); if (mflagdowork) { // 执行相应的处理 // 具体处理的工作就在这里 activeoncallback("test"); } } } /// <summary> /// 启动controller处理 /// </summary> public void start() { if (mflagwhile) mthread.start(); } /// <summary> /// 关闭controller处理 /// </summary> public void stop() { mflagwhile = false; mflagdowork = false; mthread.abort(); } /// <summary> /// 激活oncallback() /// </summary> private void activeoncallback() { if(mlistenerlist!=null) foreach (icallbacklistener tcallback in mlistenerlist) { tcallback.oncallback(); } } /// <summary> /// 激活oncallback(string) /// </summary> /// <param name="pwhat">传入的参数</param> private void activeoncallback(string pwhat) { if (mlistenerlist != null) foreach (icallbacklistener tcallback in mlistenerlist) { tcallback.oncallback(pwhat); } } /// <summary> /// 设置listener /// </summary> /// <param name="pcallbacklistener">继承icallbacklistener接口的类</param> public void setonlistener(icallbacklistener pcallbacklistener) { if (pcallbacklistener != null) mlistenerlist.add(pcallbacklistener); } /// <summary> /// 移除listener /// </summary> /// <param name="pcallbacklistener">继承icallbacklistener接口的类</param> public void removeonlistener(icallbacklistener pcallbacklistener) { if (pcallbacklistener != null) mlistenerlist.remove(pcallbacklistener); } } }
接着就是如何使用这个类了,简单的创建一个winform,一个button用来停止,一个textbox用来打印。
具体的用法里面都有注释!便于大家理解。
代码如下:
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.windows.forms; using listener; namespace eventtest { // form一定要继承icallbacklistener并实现其方法 public partial class formtest : form, icallbacklistener { // ui更新委托 private delegate void delegatetextbox(string pstring); // 控制器 private controller mcontroller; public formtest() { initializecomponent(); } private void form1_load(object sender, eventargs e) { // 初始化控制器,设置侦听,并开始 mcontroller = new controller(); mcontroller.setonlistener(this); mcontroller.start(); } // override 接口实现 public void oncallback() { // 线程安全处理 if (invokerequired) { textbox1.invoke(new delegatetextbox(pushtextintextbox), new object[] { null }); } } // override 接口实现 public bool oncallback(string pwhat) { // 线程安全处理 if (invokerequired) { textbox1.invoke(new delegatetextbox(pushtextintextbox), new object[] { pwhat }); } return false; } private void button1_click(object sender, eventargs e) { // 停止控制器 mcontroller.stop(); } /// <summary> /// 接收委托的方法,该方法通过invoke控制ui /// </summary> /// <param name="ptext">传入的string参数</param> private void pushtextintextbox(string ptext) { if (ptext != null) { textbox1.text += "\n当前的处理:" + ptext; } else { textbox1.text += "\n空消息!"; } } private void form1_formclosing(object sender, formclosingeventargs e) { mcontroller.stop(); } } }
希望本文所述实例对大家c#程序设计有一定的帮助。