当前位置: 首页 > news >正文

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 = 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();

        }
    }
}

TianYiHeWenQi项目源码下载

转载于:https://www.cnblogs.com/jihua/p/csharpevent.html

相关文章:

  • 仿真反射详解(二)
  • alwayson01-搭建域环境
  • freemark基础知识
  • avaweb(三十二)——JDBC学习入门
  • 希尔排序之C++实现(初级版)
  • 在linux中,如何增加、修改、删除、暂停和冻结用户名
  • 深入理解Java内存模型——volatile
  • js面试中长见的算法题(转载)
  • Mybatis避免出现语法错
  • 94)图片验证码
  • css的存在形式及优先级
  • Java学习3——java介绍
  • VS编译器问题总结
  • 软件工程进阶
  • lilntcode-508-摆动排序
  • [译]前端离线指南(上)
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Date型的使用
  • JavaScript设计模式系列一:工厂模式
  • Java小白进阶笔记(3)-初级面向对象
  • Just for fun——迅速写完快速排序
  • learning koa2.x
  • leetcode98. Validate Binary Search Tree
  • leetcode讲解--894. All Possible Full Binary Trees
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python_OOP
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue2.0项目引入element-ui
  • 编写符合Python风格的对象
  • 力扣(LeetCode)357
  • 前端_面试
  • 驱动程序原理
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # 计算机视觉入门
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (14)Hive调优——合并小文件
  • (2015)JS ES6 必知的十个 特性
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (接口自动化)Python3操作MySQL数据库
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (四)Android布局类型(线性布局LinearLayout)
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)VirtualBox安装增强功能
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)jdk与jre的区别
  • (转)程序员疫苗:代码注入
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Core中的去虚
  • .NET Framework杂记
  • .Net Redis的秒杀Dome和异步执行