c#同一button的點擊事件中能寫兩個方法嗎?
c#中,一個窗體中有一個button,在初次實例化這個窗體時點擊這個button會執行一個操作,當用這個窗體實例化另一個對象後,點擊新實例化對象的這個button會執行另一個操作。怎麼實現呢?
我來個好玩的搞法。
按鈕的事件點擊可以認為是一個用戶創建的事件流,在Rx來說這種就是個IObservable&
var buttonClicks = Observable.FromEvent(...); // 獲取該事件流
buttonClicks.Take(1).Subscribe(e =&> { ... }); // 第一個處理器只關注第一次點擊
buttonClicks.Skip(1).Subscribe(e =&> { ... }); // 第二個處理器忽略第一次點擊
if (已經實例化另一個對象了)
{
// 做那個
}
else // 才他媽剛剛初始化
{
// 做這個
}
最直接的方法是在對象初始化的時候才給按鍵事件賦值(通過高階函數)
回答題主標題本身的問題:.NET 中默認的 Delegate 類型都是 MulticastDelegate,也就是說支持多路委託;把一個多路委託綁定到一個事件上後,當事件發生時,多路委託里的多個事件處理函數會被逐一執行。實際上,MulticastDelegate在內存里是以鏈表形式存儲的。也就是說,一個Button的點擊事件是可以綁定任意多個事件處理方法的。
至於題目正文中所提到的問題,vczh已經給出了一個答案,在一個事件處理函數里通過分支來解決。或者,題主也可以使用多路委託實現,綁定多個點擊事件,然後在每個事件處理代碼中根據當前窗體實例是哪個實例,然後選擇是否執行自身的邏輯。
你看看單例模式,模仿一下那個寫一下這個
我覺得既然你有這個需求,應該是說這個Form界面差不多,但有N種用途,那麼我覺得可以修改下Form的構造函數然後實例化的時候傳一個參數指明實例化這個Form是幹什麼用的,在你button的click事件里就很容易根據這個參數來執行不同的參數了。
@vczh vczh大神給出了比較直接的方法,也很感謝其他大神的回答。今天請教了另一位高手,解決方案如下:在寫窗體時就重載一個構造函數,根據不同需求使用不同構造函數進行實例化,在點擊事件內寫上if(fuck){}
else{
fuck();}不知道你萌是不是想這樣表達???加if去篩選
推薦閱讀:
※現在還有必要學習 GDI 嗎?WPF 能完全替代 GDI 嗎?
※如何理解WPF中的依賴項屬性(DependencyProperty)?
※學習C#的正確姿勢以及一些問題?
※UWP 程序可以載入插件嗎?
※請問c# 做wpf程序是如何將圖片嵌入到exe程序裡面的?