当前位置: 移动技术网 > IT编程>开发语言>c# > C#采用Winform实现类似Android的Listener

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网