2013-07-09 32 views
3

用戶是否可以在WinForms中執行某些操作(例如,單擊按鈕)並在執行該動作的事件處理程序之前在UI線程之前執行了一些任意代碼在UI線程? (編輯:我不想自己這樣做,我想知道它是否可以實際發生,因爲在中,我需要擔心它嗎?)調用.NET WinForms事件處理程序的時機

我對事件處理程序如何獲取有點模糊在.NET中稱爲GUI事件,而且我遇到了這種實現細節很重要的情況。

**編輯***
我不關心如何連接事件處理程序,甚至如何以編程方式引發事件。我關心的是如何將我已經連接的事件處理程序作爲UI操作的結果調用的底層細節。更具體地說,我很好奇,如果事件處理函數的調用(或者導致它的事件序列)被簡單地添加到表單的消息循環中。它可能更容易顯示UI線程「視覺上」...

時間--------->
檢測到物理點擊.......(可以將其他東西打到UI線程這裏)...........點擊事件處理程序調用

+0

你想做什麼?如果這是你自己的代碼,只要把它放在事件處理程序之前的其他邏輯... –

+2

定義任意:) –

+0

有幾種可能的技巧,並不是每種技巧都適用於每種情況。你具體是非常重要的。 –

回答

4

有兩種選擇來實現這一點。

Windows窗體中的大多數控件都提供了用於引發事件的方法。如果您控制該控件的子類,則可以在引發事件之前將自定義代碼放入方法中。

例如,你可以繼承Button,並覆蓋OnClick

override void OnClick(EventArgs e) 
{ 
    // Your code here... 
    base.OnClick(e); // This will raise the Click event 
} 

另一種選擇是訂閱事件第一,並把你的代碼的事件處理程序。事件處理程序默認會按順序調用每個委託。


我關心的,我已經迷上了事件處理程序被怎麼叫的UI操作的結果下,發動機罩的細節。更具體地說,我很好奇,如果事件處理函數的調用(或者導致它的事件序列)被簡單地添加到表單的消息循環中。

當用戶單擊按鈕時,鼠標事件將發佈到應用程序的消息循環中。按鈕在WndProc覆蓋中處理此消息(通過處理定義爲WM_REFLECT + WM_COMMAND的消息)。

如果您的問題是「可以在用戶點擊的瞬間和事件處理程序之間運行其他代碼」,那麼是的 - 代碼可以在用戶單擊時運行,並且該代碼將繼續運行,直到消息泵可以處理消息。

+0

甚至沒有接近我所問的。請參閱更新的問題。謝謝,不過。 – aaronburro

+1

@aaronburro我添加了一個編輯,我〜相信〜回答你的問題 - 這並不完全清楚你在這裏之後... –

+0

你的編輯是有用的,幾乎回答我的問題... 「可以運行其他代碼...「應該更改爲」可以在UI線程*之間運行其他代碼*「 – aaronburro

0

您最好的選擇可能是繼承您的按鈕,然後將您的代碼添加到重寫OnClick方法(在調用基地OnClick之前)。該代碼將在任何附加的事件處理程序(用於單擊)之前執行。