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

时间:2022-01-25 13:59:25

这是一个自定义事件的例子。c#、winform、visual studio 2017。

在hovertreeform中画一块草地,上面有许多草(模拟)。

hewenqitianyi类模拟天气,会引发“风”事件(hovertreewindevent),风有东风或西风,或静止。

当吹东风,草往西边倒,吹西风则往东边到。静止则草不会东歪西倒。

草地上每一颗草都监听hovertreewindevent事件,根据风向(windddirection)调整姿态。

hewenqitianyi中有定时器,每隔一段时间触发调整风向的事件。

由于监听到的“风”事件不是winform中的线程,要改变winform中“草”的姿态,

使用了begininvoke方法和委托,在winform线程外访问控件。具体看hovertreegrass用户控件。

效果图:

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

hewenqitianyi类代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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);
}

自定义用户控件代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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窗体代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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.rar

总结

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

原文链接:http://www.cnblogs.com/jihua/archive/2017/08/18/csharpevent.html