這是一個自定義事件的例子。c#、winform、visual studio 2017。
在hovertreeform中畫一塊草地,上面有許多草(模擬)。
hewenqitianyi類模擬天氣,會引發“風”事件(hovertreewindevent),風有東風或西風,或靜止。
當吹東風,草往西邊倒,吹西風則往東邊到。靜止則草不會東歪西倒。
草地上每一顆草都監聽hovertreewindevent事件,根據風向(windddirection)調整姿態。
hewenqitianyi中有定時器,每隔一段時間觸發調整風向的事件。
由于監聽到的“風”事件不是winform中的線程,要改變winform中“草”的姿態,
使用了begininvoke方法和委托,在winform線程外訪問控件。具體看hovertreegrass用戶控件。
效果圖:
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