C#自定义事件模拟风吹草摇摆效果
发布时间 - 2026-01-11 02:51:14 点击率:次这是一个自定义事件的例子。C#、WinForm、Visual Studio 2017。

在HoverTreeForm中画一块草地,上面有许多草(模拟)。
HewenqiTianyi类模拟天气,会引发“风”事件(HoverTreeWindEvent),风有东风或西风,或静止。
当吹东风,草往西边倒,吹西风则往东边到。静止则草不会东歪西倒。
草地上每一颗草都监听HoverTreeWindEvent事件,根据风向(WindDdirection)调整姿态。
HewenqiTianyi中有定时器,每隔一段时间触发调整风向的事件。
由于监听到的“风”事件不是WinForm中的线程,要改变WinForm中“草”的姿态,
使用了BeginInvoke方法和委托,在WinForm线程外访问控件。具体看HoverTreeGrass用户控件。
效果图:
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 = 3000;
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(3));
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(40 - 9, label_grass.Location.Y);
label_grass.Text="\\";
break;
case WindDdirection.West:
label_grass.Location = new System.Drawing.Point(40+9, label_grass.Location.Y);
label_grass.Text = "/";
break;
case WindDdirection.Static:
label_grass.Location = new System.Drawing.Point(40, 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 = 0; i < tableLayoutPanel_hovertree.ColumnCount; i++) {
for (int j = 0; j < tableLayoutPanel_hovertree.RowCount; j++) {
tableLayoutPanel_hovertree.Controls.Add(new HoverTreeGrass(), i, j);
}
}
HewenqiTianyi h_ty = new HewenqiTianyi();
}
}
}
源码下载:http://xiazai./201707/yuanma/TianYiHeWenQi.rar
总结
以上所述是小编给大家介绍的C#自定义事件模拟风吹草摇摆效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# c#
# 自定义事件
# C#事件管理器如何清空所有监听详解
# 详解C#之事件
# C#创建自定义控件及添加自定义属性和事件使用实例详解
# C#Button窗体常用属性及事件详解
# 一篇文章彻底搞清楚c#中的委托与事件
# c#在程序中定义和使用自定义事件方法总结
# C#事件(event)使用方法详解
# C#事件实例详解
# C# 标准事件流实例代码
# 自定义
# 小编
# 东歪西倒
# 在此
# 中有
# 一颗
# 这是一个
# 有许多
# 给大家
# 每隔
# 所述
# 草地上
# 给我留言
# 值为
# 感谢大家
# 源码下载
# 有一个
# 往西
# 画一
# 往东
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
如何在IIS服务器上快速部署高效网站?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何在万网主机上快速搭建网站?
大同网页,大同瑞慈医院官网?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
JS经典正则表达式笔试题汇总
QQ浏览器网页版登录入口 个人中心在线进入
JS碰撞运动实现方法详解
Laravel怎么使用artisan命令缓存配置和视图
香港服务器如何优化才能显著提升网站加载速度?
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
如何用好域名打造高点击率的自主建站?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
如何用IIS7快速搭建并优化网站站点?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何为不同团队 ID 动态生成多个独立按钮
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
网页设计与网站制作内容,怎样注册网站?
网站建设整体流程解析,建站其实很容易!
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
简单实现jsp分页
Swift开发中switch语句值绑定模式
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
如何快速登录WAP自助建站平台?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Windows Hello人脸识别突然无法使用
如何在服务器上三步完成建站并提升流量?
利用python获取某年中每个月的第一天和最后一天
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
微信小程序 wx.uploadFile无法上传解决办法
Python进程池调度策略_任务分发说明【指导】
Android利用动画实现背景逐渐变暗
5种Android数据存储方式汇总
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
微信小程序 五星评分(包括半颗星评分)实例代码
香港服务器租用费用高吗?如何避免常见误区?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Android GridView 滑动条设置一直显示状态(推荐)
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
Laravel如何为API生成Swagger或OpenAPI文档
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
如何在IIS7上新建站点并设置安全权限?

