posts - 285,  comments - 130,  trackbacks - 0
公告

这是一个自定义事件的例子。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项目源码下载

posted on 2017-08-18 08:55 计划 阅读(...) 评论(...) 编辑 收藏