C#自定義事件模擬風(fēng)吹草搖擺效果
這是一個(gè)自定義事件的例子。C#、WinForm、Visual Studio 2017。
在HoverTreeForm中畫一塊草地,上面有許多草(模擬)。
HewenqiTianyi類模擬天氣,會(huì)引發(fā)“風(fēng)”事件(HoverTreeWindEvent),風(fēng)有東風(fēng)或西風(fēng),或靜止。
當(dāng)吹東風(fēng),草往西邊倒,吹西風(fēng)則往東邊到。靜止則草不會(huì)東歪西倒。
草地上每一顆草都監(jiān)聽HoverTreeWindEvent事件,根據(jù)風(fēng)向(WindDdirection)調(diào)整姿態(tài)。
HewenqiTianyi中有定時(shí)器,每隔一段時(shí)間觸發(fā)調(diào)整風(fēng)向的事件。
由于監(jiān)聽到的“風(fēng)”事件不是WinForm中的線程,要改變WinForm中“草”的姿態(tài),
使用了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);
//相當(dāng)于以下代碼
//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)
{
// 當(dāng)一個(gè)控件的InvokeRequired屬性值為真時(shí),說明有一個(gè)創(chuàng)建它以外的線程想訪問它
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
總結(jié)
以上所述是小編給大家介紹的C#自定義事件模擬風(fēng)吹草搖擺效果,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
C#在Winform開發(fā)中使用Grid++報(bào)表
這篇文章主要介紹了C#在Winform開發(fā)中使用Grid++報(bào)表,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
C#后臺(tái)接受前臺(tái)JSON字符串裝換成字典集合處理
本文介紹C#利用Newtonsoft接收前端的JSON字符串,并解析反序列化成字典集合,對(duì)其進(jìn)行處理。2016-04-04
C# GetMethod方法的應(yīng)用實(shí)例講解
GetMethod 是獲取當(dāng)前 Type 的特定方法,具有多個(gè)重載, GetMethod 即使用指定的綁定約束搜索指定方法,本文給大家介紹了C# GetMethod方法的應(yīng)用實(shí)例,需要的朋友可以參考下2024-04-04
C#/VB.NET?將Word與Excel文檔轉(zhuǎn)化為Text
這篇文章主要介紹了C#/VB.NET?將Word與Excel文檔轉(zhuǎn)化為Text,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08
C# 計(jì)算標(biāo)準(zhǔn)偏差相當(dāng)于Excel中的STDEV函數(shù)實(shí)例
下面小編就為大家?guī)硪黄狢# 計(jì)算標(biāo)準(zhǔn)偏差相當(dāng)于Excel中的STDEV函數(shù)實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
常用.NET工具(包括.NET可再發(fā)行包2.0)下載
常用.NET工具(包括.NET可再發(fā)行包2.0)下載...2007-03-03

