在選單程式設計中,我們需要使用者點擊選單項目時,程式能執行對應命令或改變選單狀態,以實現良好的使用者互動。這就需要撰寫選單事件的回應函式,使其執行相應功能。
MenuItem 類別提供了豐富的事件,主要包含:
透過為這些事件撰寫回應方法,我們即可使用選單控制程式流程。
C# 引入 delegate(委派)型別解決事件處理問題。委派類似 C 語言的函式指標,但具備型別安全與受控代碼特性。您可以使用 += 運算子輕鬆為 .NET 物件的事件新增一個或多個回應方法;使用 -= 運算子移除這些回應方法。
// 為按鈕 button1 的 Click 事件新增回應方法
button1.Click += new System.EventHandler(Test);
// 事件處理方法簽章
private void Test(object sender, System.EventArgs e)
{
// 具體執行程式碼
}
事件處理方法包含兩個參數:
sender:觸發事件的物件,型別為 object 以適用所有物件類型。e:事件相關資料(如滑鼠座標等),具體型別依事件類型而定。可透過查看類別中事件的宣告來確定。例如 Button 類別的 Click 事件(繼承自 Control):
public event EventHandler Click;
其中 EventHandler 為委派型別,定義如下:
public delegate void EventHandler(object sender, EventArgs e);
與所有 .NET 物件相同,為選單項目新增 Click 事件回應方法採用相同模式:
// 建立主選單並新增兩個選單項目
this.Menu = new MainMenu(new MenuItem[] {
new MenuItem("檔案(&F)"),
new MenuItem("編輯(&E)")
});
// 為第一個選單項目(索引 0)新增兩個 Click 事件處理器
this.Menu.MenuItems[0].Click += new System.EventHandler(Test);
this.Menu.MenuItems[0].Click += new System.EventHandler(MenuItem2_Click);
private void Test(object sender, System.EventArgs e)
{
// 具體執行程式碼
}
private void MenuItem2_Click(object sender, System.EventArgs e)
{
MessageBox.Show("您點擊了第二個選單項目", "提示訊息");
}
若要為選單項目(如 menuItem1)新增 DrawItem(繪製)事件回應方法:
menuItem1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(MyMethod);
private void MyMethod(object sender, DrawItemEventArgs e)
{
// 注意第二個參數為 DrawItemEventArgs
MessageBox.Show("DrawItem 事件被觸發", "提示訊息");
}
前文已說明選單項目是構成各類選單的基本元素。由於我們直接透過存取選單項目來新增事件回應方法,因此為選單新增事件回應方法與主選單或彈出式選單無關,統一操作 MenuItem 物件即可。