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上新建站点并设置安全权限?