C#自定义事件模拟风吹草摇摆
这是一个自定义事件的例子。C#、WinForm、Visual Studio 2017。
在HoverTreeForm中画一块草地,上面有许多草(模拟)。
HewenqiTianyi类模拟天气,会引发“风”事件(HoverTreeWindEvent),风有东风或西风,或静止。
当吹东风,草往西边倒,吹西风则往东边到。静止则草不会东歪西倒。
草地上每一颗草都监听HoverTreeWindEvent事件,根据风向(WindDdirection)调整姿态。
HewenqiTianyi中有定时器,每隔一段时间触发调整风向的事件。
由于监听到的“风”事件不是WinForm中的线程,要改变WinForm中“草”的姿态,
使用了BeginInvoke方法和委托,在WinForm线程外访问控件。具体看HoverTreeGrass用户控件。
by 何问起
参考:http://hovertree.com/h/bjag/k0qps1iw.htm
http://hovertree.com/h/bjag/cm8k4ja1.htm
效果图:
HewenqiTianyi类代码:
using System;
using System.Timers; namespace TianYiHeWenQi
{
class HewenqiTianyi
{
public static event ActionEventHandler HoverTreeWindEvent;
WindEventArgs _arg = new WindEventArgs();
public HewenqiTianyi()
{
Timer h_timer = new Timer();
h_timer.Interval = ;
h_timer.Elapsed += H_timer_Elapsed;
h_timer.Start();
}
Random _HoverClock=new Random ();
private void H_timer_Elapsed(object sender, ElapsedEventArgs e)
{
_arg.WindType = (WindDdirection)(_HoverClock.Next());
OnAction(_arg);
} protected void OnAction(WindEventArgs ev)
{
HoverTreeWindEvent?.Invoke(ev);
//相当于以下代码
//if (HoverTreeWindEvent != null)
//{
// HoverTreeWindEvent(ev);
//}
}
} class WindEventArgs : EventArgs
{
public WindDdirection WindType { get; set; }
} enum WindDdirection
{
East,
West,
Static
} delegate void ActionEventHandler(WindEventArgs ev); }
自定义用户控件代码:
using System;
using System.Windows.Forms; namespace TianYiHeWenQi
{
public partial class HoverTreeGrass : UserControl
{
delegate void MySetText(string text);
public HoverTreeGrass()
{
InitializeComponent();
HewenqiTianyi.HoverTreeWindEvent += HewenqiTianyi_HoverTreeWindEvent;
} private void UpdateLabel(WindDdirection wd)
{
if (label_grass.InvokeRequired)
{
// 当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它
Action<WindDdirection> actionDelegate = (x) => {
switch (x)
{
case WindDdirection.East:
label_grass.Location = new System.Drawing.Point( - , label_grass.Location.Y);
label_grass.Text="\\";
break;
case WindDdirection.West:
label_grass.Location = new System.Drawing.Point(+, label_grass.Location.Y);
label_grass.Text = "/";
break;
case WindDdirection.Static:
label_grass.Location = new System.Drawing.Point(, label_grass.Location.Y);
label_grass.Text = "|";
break;
}
};
// 或者
// Action<string> actionDelegate = delegate(string txt) { this.label_grass.Text = txt; };
this.label_grass.BeginInvoke(actionDelegate, wd);
}
else
{
switch (wd)
{
case WindDdirection.East:
label_grass.Text = "\\";
break;
case WindDdirection.West:
label_grass.Text = "/";
break;
case WindDdirection.Static:
label_grass.Text = "|";
break;
}
}
} private void HewenqiTianyi_HoverTreeWindEvent(WindEventArgs ev)
{
UpdateLabel(ev.WindType);
}
}
}
HoverTreeForm窗体代码:
using System.Windows.Forms; namespace TianYiHeWenQi
{
public partial class HoverTreeForm : Form
{
public HoverTreeForm()
{
InitializeComponent(); for (int i = ; i < tableLayoutPanel_hovertree.ColumnCount; i++) {
for (int j = ; j < tableLayoutPanel_hovertree.RowCount; j++) {
tableLayoutPanel_hovertree.Controls.Add(new HoverTreeGrass(), i, j);
}
}
HewenqiTianyi h_ty = new HewenqiTianyi(); }
}
}
C#自定义事件模拟风吹草摇摆的更多相关文章
- javaScript事件机制深入学习(事件冒泡,事件捕获,事件绑定方式,移除事件方式,阻止浏览器默认行为,事件委托,模拟浏览器事件,自定义事件)
前言 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软 ...
- js原生创建模拟事件和自定义事件的方法
让我万万没想到的是,原来<JavaScript高级程序设计(第3版)>里面提到的方法已经是过时的了.后来我查看了MDN,才找到了最新的方法. 模拟鼠标事件MDN上已经说得很清楚,尽管为了保 ...
- JS 中的自定义事件和模拟事件
在 JS 中模拟事件指的是模拟 JS 中定义的一些事件,例如点击事件,键盘事件等. 自定义事件指的是创建一个自定义的,JS 中之前没有的事件. 接下来分别说一下创建这两种事件的方法. 创建自定义事件 ...
- 深入理解DOM事件机制系列第四篇——事件模拟
× 目录 [1]引入 [2]模拟机制 [3]自定义事件 前面的话 事件是网页中某个特别的瞬间,经常由用户操作或通过其他浏览器功能来触发.但实际上,也可以使用javascript在任意时刻来触发特定的事 ...
- Notes:DOM的事件模拟
首先使用document对象的createEvent方法创建一个事件对象,然后初始化该事件对象,接着使用支持事件DOM节点的dispatchEvent方法触发事件. DOM2级事件和DOM3级事件有些 ...
- javascript事件之:谈谈自定义事件(转)
http://www.cnblogs.com/pfzeng/p/4162951.html 对于JavaScript自定义事件,印象最深刻的是用jQuery在做图片懒加载的时候.给需要懒加载的图片定义一 ...
- javascript和jquey的自定义事件小结
“通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用 ...
- Javascript事件模型系列(四)我所理解的javascript自定义事件
被我拖延了将近一个月的javascript事件模型系列终于迎来了第四篇,也是我计划中的最后一篇,说来太惭愧了,本来计划一到两个星期写完的,谁知中间遇到了很多事情,公司的个人的,搞的自己心烦意乱浮躁了一 ...
- javascript事件之:谈谈自定义事件
对于JavaScript自定义事件,印象最深刻的是用jQuery在做图片懒加载的时候.给需要懒加载的图片定义一个appear事件.当页面图片开始出现时候,触发这个自定义的appear事件(注意,这里只 ...
随机推荐
- C++标准模板库(STL)之Map
1.Map的常用用法 map:映射.可以将任何基本类型,结构体,STL容器映射到任何基本类型包括容器. 使用map,需要加map的头文件,#include<map>和using names ...
- slice,substring,substr的区别
1.都为正整数//例子数据 var arr = [1,2,3,4,5,6,7], var str = "helloworld!"; //注意这里有个!号也算一位若有空格,空格也算一 ...
- SharePoint附加内容数据库时报错
今天遇到一个很奇怪的问题,在sharepoint管理中心中给web application添加内容数据库时报错:The SharePoint database named WSS Content al ...
- week2
三元函数: a,b,c = 1,2,3 d = a if a>b else c print(d) #list 用法: lst = [1,2,3,4,5] print(lst[0:3]) prin ...
- flask 第三章 特殊装饰器 CBV Flask-Session WTForms
1.flask中的特殊装饰器 前面我们讲过的装饰器函数中,用来登录验证,这次我们来介绍几个flask中的特殊装饰器 1). @app.before_request 具体的用途是: 在请求进入视图函数之 ...
- 第九次作业——K-means算法应用:图片压缩
一.读取一张示例图片或自己准备的图片,观察图片存放数据特点. 根据图片的分辨率,可适当降低分辨率. 再用k均值聚类算法,将图片中所有的颜色值做聚类. 然后用聚类中心的颜色代替原来的颜色值. 形成新的图 ...
- vim学习纪要
普通模式 根据屏幕行上下移动. gj gk g0 g^ g$ 移动到行首第一个非空字符 ^ 反向移动到上一单词的词尾 ge 插入模式 粘贴寄存器中内容 <C-r> 可视模式 移动光标的起始 ...
- 为什么Python是最适合初创公司的编程语言?
为什么Python是最适合初创公司的编程语言? 选自Medium 作者:Gleb Pushkov 京东云开发者社区编译 对于初创公司而言,要在众多编程语言中为公司选择一个正确.合适的语言绝非易事. 如 ...
- 原生js实现下拉菜单
简单给两段代码: html和css部分: <style> .one li{ width:100px; height:30px; line-height:30px; background:u ...
- jQuery 的自定义事件
jQuery 中,想要自动触发自定义事件,必须满足2个条件: 1.事件必须是通过on 来绑定的. 2.事件必须是通过trigger / triggerHandler 来触发. 格式如下: $(fun ...