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 ...
随机推荐
- VS2010 删除空行
查找内容:^:b*$\n 替换为: 查找范围:当前文档 使用:正则表达式 vs2013 ^\s*(?=\r?$)\n
- C#.Net 导出Excel 之单元格 相关设置
range.NumberFormatLocal = "@"; //设置单元格格式为文本range = (Range)worksheet.get_Range("A1 ...
- 简单版问卷调查系统(Asp.Net+SqlServer2008)
1.系统主要涉及以下几个表 问卷项目表(Q_Naire) 问卷题目表(Q_Problem) 题目类型表(Q_ProblmeType) 题目选项表(Q_Options) 调查结果表(Q_Answer) ...
- 解决Windows时间同步失败问题!系统时间同步设置!
使用NTP协议可以让你的计算机自动与服务器上的时间同步.从而保持最准确的时间. 中国国家授时中心的IP地址是:210.72.145.44 (至少我一直没ping通) 在Windows XP/2000/ ...
- HDU 5777 domino (排序,水题)
题意:小白在玩一个游戏.桌子上有n张多米诺骨牌排成一列.它有k次机会,每次可以选一个还没有倒的骨牌,向左或者向右推倒.每个骨 牌倒下的时候,若碰到了未倒下的 骨牌,可以把它推倒.小白现在可以随意设置骨 ...
- C#之数组
什么是数组?数组是一种数据结构,包含同一个类型的多个元素.数组的声明:int[] myIntArray; 注:声明数组时,方括号 ([]) 必须跟在类型后面,而不是变量名后面.在 C# 中,将方括号放 ...
- java dbcp连接池的使用
package com.jb.jubmis.comm; import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQL ...
- JavaScript要点(十七) Math 对象
来源:JavaScript 参考手册 Math 对象 Math 对象用于执行数学任务. Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(). 语法 var ...
- jquery获取表单的值
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- php 内置http服务器
PHP从5.4.0起,内置了一个http服务器,开发人员可以借助这个内置服务器来做一些本地测试. 启动服务器: 打开终端,进入php安装目录,然后执行 php -S localhost: 这样就可以开 ...