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();
if (mFlagDoWork)
{
// 执行相应的处理
// 具体处理的工作就在这里
ActiveOnCallBack();
}
Thread.Sleep();
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#采用Winform实现类似Android的Listener的更多相关文章
- WinForm实现类似QQ停靠,显示隐藏过程添加特效效果
原文:WinForm实现类似QQ停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右 ...
- .net winForm 实现类似qq 弹出新闻
.net winForm 实现类似qq 弹出新闻 一.背景: echong 之前一直用 公司大牛c语言写的一个弹出托管,前几天写东西的时候发现com调用不是那么好使.而手头上写的这个东西又是.ne ...
- c# winform 类似android toast消息功能
先看下效果: 支持动画,支持声音,支持定时自动关闭 使用方法: var notifycation = new Notification("My Notification", &qu ...
- 【转】iOS类似Android上toast效果
原文网址:http://m.blog.csdn.net/article/details?id=50478737 做过Android开发的人都知道toast,它会在界面上显示一排黑色背景的文字,用于提示 ...
- 在Android中动画移动一个View的位置,采用Scroller类实现Android动画之 View移动
在Android中动画移动一个View的位置,采用Scroller类实现 今天说最近自己遇到的一个问题,就是要用动画效果来移动一个VIew的位置. 这个具体的情况是,需要做一个SlidingMenu的 ...
- Android抽屉(SlidingDrawer --类似android通知栏下拉效果)
Android抽屉(SlidingDrawer)的实现发 - 红黑联盟http://www.2cto.com/kf/201301/182507.html 可动态布局的Android抽屉之基础http: ...
- iOS开发的另类神器:libimobiledevice开源包【类似android adb 方便获取iOS设备信息】
简介 libimobiledevice又称libiphone,是一个开源包,可以让Linux支持连接iPhone/iPod Touch等iOS设备.由于苹果官方并不支持Linux系统,但是Linux上 ...
- 采用MQTT协议实现android消息推送(4)选fusesource-mqtt-client为客户端
1.简介 一个java写的mqtt客户端.项目地址: https://github.com/fusesource/mqtt-client 2.引入fusesource-mqtt-client库 Fil ...
- Android 创建Listener监听器形式选择:匿名内部类?外部类?
说到监听器,第一感觉就是直接写作匿名内部类来用,可是依据单一职责原则,好像又不应该作为匿名内部类来写(由于监听中有时要写较多的逻辑代码),所曾经段时间把有共性的listener单独创建放在glut.l ...
随机推荐
- Android通过tcpdump抓包
1. 手机要有root权限 2. 下载tcpdump http://www.strazzere.com/android/tcpdump 3. adb push c:\wherever_you_pu ...
- php--opp--1.什么是面向对象?
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...
- Delphi IOS环境安装
RAD Delphi XE/10 Seattle 安装IOS.OSX环境安装,IOS模拟器,MAC X 真机可以调试 http://community.embarcadero.com/blogs/en ...
- 异步编程之Promise(2):探究原理
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- C++11之sizeof
[C++11之sizeof] 在标准C++,sizeof可以作用在对象以及类别上.但是不能够做以下的事: 这会传回OtherType的大小.C++03并不允许这样做,所以会引发编译错误.C++11将会 ...
- TdxAlertWindowManager右下角HINT显示控件
带爱像的右下角HINT显示,自动隐藏 function alterInfo: TdxAlertWindowManager;begin if not Assigned(Falter) then be ...
- CodeForces 709C Letters Cyclic Shift (水题)
题意:给定一个字符串,让你把它的一个子串字符都减1,使得总字符串字典序最小. 析:由于这个题是必须要有一个字串,所以你就要注意这个只有一个字符a的情况,其他的就从开始减 1,如果碰到a了就不减了,如果 ...
- C#之数组
什么是数组?数组是一种数据结构,包含同一个类型的多个元素.数组的声明:int[] myIntArray; 注:声明数组时,方括号 ([]) 必须跟在类型后面,而不是变量名后面.在 C# 中,将方括号放 ...
- Java和MongoDB之Hello World
1.新建Project 新建Java Project,并把mongo-java-driver驱动加入到项目bulid path中,如果你使用的是maven增加依赖. <dependency> ...
- INNO&&DELPHI
好久不弄delphi了,再次见到inno,居然不知所措~ 让人亲切的 var,又见到了.而如今,到处可见. 整目录复制 Flags: igNoreversion recursesubdirs crea ...