簡體   English   中英

如何在C#中引發事件?

[英]How is an event raised in C#?

我對控制台應用程序C#中的事件的理解:

  1. 創建一個與訂閱者類中的事件處理程序方法具有相同簽名的委托。

  2. 根據此委托聲明一個事件

  3. 引發事件
    我對這一步驟的理解是:它只是一個包裝函數,將參數傳遞給事件以調用事件指向的事件處理函數。

因此引發事件只是調用publish類中的wrapper函數。

現在,當我創建一個非常簡單的Windows窗體應用程序時,我將無法應用此一般概念。

考慮僅一個按鈕的WinForms應用程序。

// registering statement
Button1.Click += new EventHandler (this.button1_click)
  1. 我可以確定第一步。 它是預定義的System.EventHandler委托。

  2. 按鈕的點擊事件也是預先定義的。 沒問題。

  3. 事件引發步驟:在這里,我無法在控制台應用程序和Windows應用程序之間建立連接。

在哪里保存了實際引發WinForms應用程序事件的代碼? 我們似乎不必編寫代碼。

我知道有人“單擊”按鈕時會引發單擊事件,但是在WinForms應用程序的C#代碼中如何實現呢?

編譯器如何“公正地”知道按鈕的Click事件意味着某人單擊按鈕,因此應該引發一個事件?

如何引發點擊事件? 參數如何傳遞給事件?

Control類具有稱為WndProc受保護函數,當操作系統需要告知程序某些內容時,它將生成一個Message對象,並將其傳遞給WndProc函數。

然后,該WndProc函數查看該消息並查看消息的類型,如果它是“ 鼠標左鍵向上 ”消息,則它將運行OnClick方法,並從傳遞給WndProcMessage對象中解析出正確的參數。

那個OnClick方法是將事件引發給訂閱者的東西。

從.NET的來源來看:

您的理解有些倒退。 我認為這就是您遇到問題的原因。

沒有創建與訂閱者類中的事件處理程序方法具有相同簽名的委托。

您正在執行的操作是聲明要委派執行的功能的外觀。 這是EventHandler的簽名:

public delegate void EventHandler(object sender, EventArgs e)

因此,如果您希望某個函數能夠處理事件的委托,則它必須遵循該簽名。

現在,將執行委托給訂閱者的類需要引用這些函數,以便在事件發生時可以調用它們。 這就是為什么要實現事件屬性。 隨之而來的是,Button類必須公開此屬性,以便您能夠“掛鈎”您的代表:

public event EventHandler Click

(注意,這是從Control繼承的)

當您注冊“事件處理程序”時:

Button1.Click += new EventHandler (this.button1_click)

本質上,您是在說,每當Button1實例引發Click事件時,都將觸發this.button1_click(object sender, EventArgs e)

Button1實例將在內部決定何時觸發事件,屆時它將使用event屬性將執行委派給訂閱的函數。 它將使用上述參數調用它們,其中發送者很可能是實例本身,而EventArgs類將為您提供有關引發事件的條件的其他信息。 通常還可以實現該屬性以添加其他檢查(例如,首先是否有任何要調用的內容)。

如您所見,真正引起點擊的代碼是Button(或其繼承鏈)實現的內部。 顯然,它涉及鼠標跟蹤,而不涉及鼠標跟蹤,這就是使用控件的好處,除非您想從頭開始編寫所有檢測內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM