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

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

(0)

相关推荐

  • C#中Winform窗体Form的关闭按钮变灰色的方法

    本文实例讲述了C#中Winform窗体Form的关闭按钮变灰色的方法,对C#程序设计有一定的借鉴价值,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: [ DllImport ( "USER32.DLL" ) ] public static extern int GetSystemMenu(int hwnd, int bRevert); [ DllImport ( "USER32.DLL" ) ] public static extern int Rem

  • C#中winform实现自动触发鼠标、键盘事件的方法

    程序触发鼠标.键盘事件是C#程序设计中比较常见的功能,本文实例展示了C#中winform实现自动触发鼠标.键盘事件的方法,有不错的实用价值.具体如下: 要想在C#程序中触发鼠标.键盘事件就必须要调用windows函数. 一.鼠标事件的触发 1.引用windows函数mouse_event /// <summary> /// 鼠标事件 /// </summary> /// <param name="flags">事件类型</param> /

  • C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法

    本文实例讲述了C# Winform实现捕获窗体最小化.最大化.关闭按钮事件的方法,主要是通过重写WndProc来实现的.分享给大家供大家参考.具体方法如下: 主要功能代码如下: const int WM_SYSCOMMAND = 0x112; const int SC_CLOSE = 0xF060; const int SC_MINIMIZE = 0xF020; const int SC_MAXIMIZE = 0xF030; protected override void WndProc(ref

  • WinForm中变Enter键为Tab键实现焦点转移的方法

    本文实例讲述了WinForm中变Enter键为Tab键实现焦点转移的方法,在进行C#应用程序开发时有一定的实用价值.分享给大家供大家参考. 具体实现代码如下: /// <summary> /// 窗体控件控制相关的方法 /// </summary> public class ControlTools { private Form frm; public ControlTools(Form frm) { this.frm = frm; } /// <summary> //

  • WinForm中的几个实用技巧汇总

    本文汇总了几个WinForm中常见的实用技巧,对于C#程序开发有着很好的参考借鉴价值.具体分析如下: 一.屏蔽窗体右上角关闭按钮 1.重写OnClosing protected override void OnClosing(CancelEventArgs e) { if(this.Visible) { e.Cancel=true; // // WHATE TODO // } } 2.重写WndProc protected override void WndProc(ref Message m)

  • C#之WinForm WebBrowser实用技巧汇总

    本文实例汇总了C#中WinForm WebBrowser常见的实用技巧,对于C#程序开发来说有不错的借鉴价值.分别叙述如下: 方法1:获取状态栏信息 void webBrowser1_StatusTextChanged(object sender, EventArgs e) { label1.Text = webBrowser1.StatusText; } 方法2:页面跳转后改变地址栏地址 //在Navigated事件处理函数中改变地址栏地址是最恰当的: private void webBrow

  • C#实现延时并自动关闭MessageBox的方法

    我们在C#编程中常见的信息提示框(MessageBox)是微软NET自带的一个用于弹出警告.错误或者讯息一类的"模式"对话框.此类对话框一旦开启,则后台窗体无法再被激活(除非当前的MessageBox被点击或者关闭取消).那么如何使用程序模拟鼠标点击这个messageBox(关闭这个MessageBox)令其延时并自动关闭呢?答案是你在弹出这个messageBox之前先启用一个定时器,定时器内部不断向窗体发送Enter按钮用于模拟点击MsgBox的内容,同时主程序中弹出模式消息框. 具

  • WinForm相对路径的陷阱

    本文所述为使用WinForm相对路径时需要注意的陷阱.这类错误经常会遇到!现分析如下供大家参考. 在Window系统上利用相对路径进行操作时,有一个"当前目录"的概念,如果程序中是利用相对路径进行操作,系统会认为是在当前目录下进行操作,即 相对路径 等于 当前目录 + 相对路径 所组成的绝对路径. 应用程序默认的当前目录为:程序入口所在路径. 并且在WinForm中,OpenFileDialog.RestoreDirectory 或 SaveFileDialog.SaveFileDia

  • WinForm的延时加载控件概述

    本文主要针对WinForm的延迟加载在常用控件的实现做简单的描述.在进行C#项目开发的时候具有一定的实用性.具体如下: 一.在界面第一次显示时加载.最简单的延迟加载可以通过控件第一次显示时加载数据,例如你有很多的页签,只有用户切换到这个页签时,才会加载数据. 在.NET的Control中提供SetVisibleCore虚方法,当检测value是true且第一次调用此方法时,调用延迟加载.但是并不推荐这个方法,因为你有更好的地方. ①.如果你的控件继承自Form或者UserControl,建议重载

  • WinForm实现跨进程通信的方法

    本文实例展示了WinForm实现跨进程通信的方法,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: public class WinMessageHelper { private struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } //使用COPYDATA进行跨进程通信 public const

  • Winform下实现图片切换特效的方法

    本文实例讲述了Winform下实现图片切换特效的方法,是应用程序开发中非常实用的一个功能.分享给大家供大家参考之用.具体方法如下: 本实例源自网络,功能较为齐全.丰富!主要功能代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Drawin

随机推荐