zoukankan      html  css  js  c++  java
  • 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项目源码下载

  • 相关阅读:
    VUE参考---组件切换动画
    VUE参考---组件切换方式
    VUE参考---为什么组件中的data必须是一个方法且返回一个对象
    VUE参考---组件中的data和methods
    VUE课程---26、组件
    VUE课程---25、发ajax请求
    VUE课程---24、插件
    Spring3.2.4集成quartz2.2.1定时任务(demo)
    TODO
    【转】Mac 程序员的十种武器
  • 原文地址:https://www.cnblogs.com/jihua/p/csharpevent.html
Copyright © 2011-2022 走看看