C#自定義事件模擬風吹草搖擺效果
這是一個自定義事件的例子。C#、WinForm、Visual Studio 2017。
在HoverTreeForm中畫一塊草地,上面有許多草(模擬)。
HewenqiTianyi類模擬天氣,會引發(fā)“風”事件(HoverTreeWindEvent),風有東風或西風,或靜止。
當吹東風,草往西邊倒,吹西風則往東邊到。靜止則草不會東歪西倒。
草地上每一顆草都監(jiān)聽HoverTreeWindEvent事件,根據(jù)風向(WindDdirection)調(diào)整姿態(tài)。
HewenqiTianyi中有定時器,每隔一段時間觸發(fā)調(diào)整風向的事件。
由于監(jiān)聽到的“風”事件不是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);
//相當于以下代碼
//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屬性值為真時,說明有一個創(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
總結
以上所述是小編給大家介紹的C#自定義事件模擬風吹草搖擺效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
您可能感興趣的文章
- 01-10C#自定義簽名章實現(xiàn)方法
- 01-10WinForm實現(xiàn)自定義右下角提示效果的方法
- 01-10C#實現(xiàn)自定義windows系統(tǒng)日志的方法
- 01-10C#自定義事件監(jiān)聽實現(xiàn)方法
- 01-10C#編程實現(xiàn)自定義熱鍵的方法
- 01-10C#3.0使用EventLog類寫Windows事件日志的方法
- 01-10WinForm判斷關閉事件來源于用戶點擊右上角“關閉”按鈕的方法
- 01-10C#實現(xiàn)的三種模擬自動登錄和提交POST信息的方法
- 01-10輕松學習C#的方法
- 01-10C#自定義DataGridViewColumn顯示TreeView


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-10C#中split用法實例總結
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery


