Window Form類有很多的屬性/方法和事件,其中事件屬於一種發布訂閱模式 。訂閱發布模式定義了一種一對多的依賴關系,讓多個訂閱者對象同時監聽某一個主體對象。這個主體對象在自身狀態變化時,會通知所有訂閱者對象,使它們能夠自動更新自己的狀態。 當一個對象的改變需要同時改變其他對象,而且無需關心具體有多少對象需要改變時,就特別適合用此種模式。本文將演示如何在窗體上自定義一個事件(custom event) :
一般自定義的事件都有一個參數,繼承自EventArgs.此處我們自定一個CustomEventArgs,類中通過自定義字段來存儲參數的值:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace CustomEventsDemo 7 { 8 public class CustomEventArgs:EventArgs 9 { 10 //自定義字段用於存儲值 11 public object Tag; 12 public string Message; 13 public CustomEventArgs() 14 { 15 16 } 17 public CustomEventArgs(string message, object tag) 18 { 19 Message = message; 20 Tag = tag; 21 } 22 } 23 }
接下來我們創建一個FormPublisher窗體,然後用 event EventHandler<CustomEventArgs> customEvent;event EventHandler<CustomEventArgs> customSecondEvent和來自定義兩個custom Event事件,它們的事件參數為CustomEventArgs.在窗體加載事件中我們觸發兩個事件(這個順序會影響在窗體加載時訂閱者的事件響應順序.如果我們創建一個窗體繼承此FormPublisher的話,我們會在此窗體的事件面板中看到下圖:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace CustomEventsDemo 11 { 12 public partial class FormPublisher : Form 13 { 14 //定義兩個事件 15 public event EventHandler<CustomEventArgs> customEvent; 16 public event EventHandler<CustomEventArgs> customSecondEvent; 17 public FormPublisher() 18 { 19 InitializeComponent(); 20 } 21 22 private void FormWithCutomEvent_Load(object sender, EventArgs e) 23 { 24 //確定自定義事件的執行順序,繼承此窗體的子類窗體加載時的默認順序 25 if (customEvent != null) 26 { 27 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customEvent"); 28 customEvent(this, customEventArgs); 29 } 30 if (customSecondEvent != null) 31 { 32 33 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customSecondEvent"); 34 customSecondEvent(this, customEventArgs); 35 } 36 37 } 38 39 private void button1_Click(object sender, EventArgs e) 40 { 41 42 this.textBox2.AppendText(this.textBox1.Text + "\r\n"); 43 //this.textBox1.Text = ""; 44 if (customSecondEvent != null) 45 { 46 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customSecondEvent"); 47 //觸發事件 48 customSecondEvent(this, customEventArgs); 49 } 50 if (customEvent != null) 51 { 52 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customEvent"); 53 //觸發事件 54 customEvent(this, customEventArgs); 55 } 56 } 57 } 58 }
下面定義一個FormSubscriber窗體來訂閱自定義事件,我們要定義另一個窗體的事件,必須要先實例化那個窗體,否則會調用失敗:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace CustomEventsDemo 11 { 12 public partial class FormSubscriber : Form 13 { 14 FormPublisher form = null; 15 public FormSubscriber() 16 { 17 InitializeComponent(); 18 //啟動2個窗體 19 form = new FormPublisher(); 20 form.Visible = true; 21 //訂閱事件 22 form.customSecondEvent += form_customSecondEvent; 23 //訂閱事件 24 form.customEvent += form_customEvent; 25 //把發布窗體實例化後傳入第二個訂閱窗體中,否則不能訂閱 26 FormSubScriber2 from2 = new FormSubScriber2(form); 27 from2.Visible = true; 28 } 29 30 void form_customSecondEvent(object sender, CustomEventArgs e) 31 { 32 this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "\r\n"); 33 } 34 35 void form_customEvent(object sender, CustomEventArgs e) 36 { 37 this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "\r\n"); 38 } 39 40 private void FormSubscriber_Load(object sender, EventArgs e) 41 { 42 43 } 44 } 45 }
另一個窗體也進行訂閱:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace CustomEventsDemo 11 { 12 public partial class FormSubScriber2 : Form 13 { 14 15 public FormSubScriber2() 16 { 17 InitializeComponent(); 18 } 19 public FormSubScriber2(FormPublisher form) 20 { 21 InitializeComponent(); 22 //訂閱form自定義事件 23 form.customEvent += form_customEvent; 24 } 25 void form_customEvent(object sender, CustomEventArgs e) 26 { 27 this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "\r\n"); 28 } 29 30 private void FormSubScriber2_Load(object sender, EventArgs e) 31 { 32 33 } 34 } 35 }