C#自定义事件模拟风吹草摇摆效果

 更新时间:2017年08月18日 09:51:42   作者:计划  
这篇文章主要介绍了C#自定义事件模拟风吹草摇摆效果,草地上每一颗草都监听HoverTreeWindEvent事件,根据风向(WindDdirection)调整姿态。需要的朋友可以参考下

这是一个自定义事件的例子。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.jb51.net/201707/yuanma/TianYiHeWenQi.rar

总结

以上所述是小编给大家介绍的C#自定义事件模拟风吹草摇摆效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • C#通过html调用WinForm的方法

    C#通过html调用WinForm的方法

    这篇文章主要介绍了C#通过html调用WinForm的方法,涉及html页面中使用JavaScript访问C#的相关技巧,需要的朋友可以参考下
    2016-04-04
  • C#在Winform开发中使用Grid++报表

    C#在Winform开发中使用Grid++报表

    这篇文章主要介绍了C#在Winform开发中使用Grid++报表,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • C#后台接受前台JSON字符串装换成字典集合处理

    C#后台接受前台JSON字符串装换成字典集合处理

    本文介绍C#利用Newtonsoft接收前端的JSON字符串,并解析反序列化成字典集合,对其进行处理。
    2016-04-04
  • C# GetMethod方法的应用实例讲解

    C# GetMethod方法的应用实例讲解

    GetMethod 是获取当前 Type 的特定方法,具有多个重载, GetMethod 即使用指定的绑定约束搜索指定方法,本文给大家介绍了C# GetMethod方法的应用实例,需要的朋友可以参考下
    2024-04-04
  • c# 实现观察者模式

    c# 实现观察者模式

    这篇文章主要介绍了c# 实现观察者模式的步骤,帮助大家更好的理解和使用c#实现设计模式,感兴趣的朋友可以了解下
    2021-01-01
  • C#/VB.NET 将Word与Excel文档转化为Text

    C#/VB.NET 将Word与Excel文档转化为Text

    这篇文章主要介绍了C#/VB.NET 将Word与Excel文档转化为Text,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • C# 类的声明详解

    C# 类的声明详解

    本文主要对C# 类的声明进行详细介绍。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • C# 计算标准偏差相当于Excel中的STDEV函数实例

    C# 计算标准偏差相当于Excel中的STDEV函数实例

    下面小编就为大家带来一篇C# 计算标准偏差相当于Excel中的STDEV函数实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C#实现矩阵乘法实例分析

    C#实现矩阵乘法实例分析

    这篇文章主要介绍了C#实现矩阵乘法的方法,实例分析了通过C#数组构造矩阵及实现矩阵乘法的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 常用.NET工具(包括.NET可再发行包2.0)下载

    常用.NET工具(包括.NET可再发行包2.0)下载

    常用.NET工具(包括.NET可再发行包2.0)下载...
    2007-03-03

最新评论