首页 > 编程 > C# > 正文

C#采用Winform实现类似Android的Listener

2020-01-24 02:29:41
字体:
来源:转载
供稿:网友

本文实例讲述了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#程序设计有一定的帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表