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 ...
随机推荐
- Spark RDD概念学习系列之RDD的checkpoint(九)
RDD的检查点 首先,要清楚.为什么spark要引入检查点机制?引入RDD的检查点? 答:如果缓存丢失了,则需要重新计算.如果计算特别复杂或者计算耗时特别多,那么缓存丢失对于整个Job的影响是不容 ...
- Javascript函数柯里化(curry)
函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...
- tty & pty & pts
[tty & pty & pts] 基本概念: 1> tty(终端设备的统称):tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过 ...
- [iOS微博项目 - 2.5] - 封装授权和用户信息读写业务
github: https://github.com/hellovoidworld/HVWWeibo A.封装授权业务 1.把app的授权信息移动到HVWWeibo-Prefix.pch中作为公共 ...
- POJ 2774 Long Long Message (后缀数组模板)
借用罗大神的模板,开始搞后缀数组 #include <cstdio> #include <iostream> #include <cstring> #include ...
- iOS Framework lipo报错 lipo: can't map input file
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ ...
- android 工具类之SharePreference
/** * SharedPreferences的一个工具类,调用setParam就能保存String, Integer, Boolean, Float, Long类型的参数 * 同样调用getPara ...
- (剑指Offer)面试题17:合并两个排序的链表
题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然时按照递增排序的. 链表结点定义如下: struct ListNode{ int val; ListNode* next; }; 思 ...
- as自定义菜单。
与菜单相关的类一共有3个 ContextMenu类 ContextMenuBuiltInItems类 //与系统内置菜单相关的类 ContextMenuItem类 //与用户自定义菜单相关的类
- 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现
转自:http://www.iamsevent.com/post/36.html AS3 Coder]任务七:初涉PureMVC——天气预报功能实现 使用框架:AS3任务描述:了解PureMVC框架使 ...