2013-01-16 22 views
1

我有一個用戶界面控件與多個用戶界面對象有不同的事件處理程序訂閱他們的雙擊事件,有沒有一種方法來觸發這個雙擊事件,以響應,比如說像這樣的一個keydown事件:是否可以觸發發件人對象的事件(處理程序)以及如何?

private void UIObject_KeyDown(object sender, KeyEventArgs e) 
{ 
     if (e.KeyCode == Keys.Enter) 
     { 
      ((Control)sender).DoubleClick.Trigger(); //note: senders of varied types 
     } 
} 

? VSI表示'.... DoubleClick只能出現在 - =或+ ='的左側,因此將可調用方法添加到兩個不同的可能發件人對象類型似乎是我最簡單的希望,但類似:.Perform [ [Double]]點擊()會比dunch好得多。

回答

0

您可以直接調用事件處理程序,只要它們可見即可(即private在同一個類中,或public/internal在另一個類中)。

private void UIObject_KeyDown(object sender, KeyEventArgs e) 
{ 
     if (e.KeyCode == Keys.Enter) 
     { 
      OtherUIObject_DoubleClick(sender, e); 
      // You can replace "sender" with "this", and/or replace "e" with a new EventArgs. 
     } 
} 
private void OtherUIObject_DoubleClick(object sender, EventArgs e) 
{ 
    // Code 
} 
+1

只有在所有DoubleClick事件都使用相同的處理程序時,這纔會有效。 OP的情況並非如此。 –

+0

@mikez,OP說「有不同的事件處理程序訂閱他們的雙擊事件」,所以這意味着這個答案可能適用:) – spajce

+0

@spajce - 不,我很確定麥克斯在這種情況下是正確的。如果有幫助,我會留下答案,但可能不會。 – Bobson

1

不,這是不可能的。事件只能從它們被定義的類型觸發。也就是說,除非你有自己的類型(在這種情況下,你可以公開觸發事件的方法)。

根據您如何附加事件處理程序,您可能能夠創建一個單獨的對象,該對象具有一個委託/事件,其中也可以添加所有相同的處理程序;這將允許你觸發/調用該對象的方法而不是對象的方法。

+0

似乎有理由說,.NET旨在防止堆棧事件,你能給我一個源代碼鏈接嗎? – stackuser83

+0

@ stackuser83那麼,試圖這樣做是一個編譯器錯誤,它具體說明它只能在類型內完成。我確定它在語言規範中,但我認爲編譯器足夠可靠,足以相信它是真的。 – Servy

0

將控件映射到委託然後對所有控件使用相同的雙擊和按鍵處理程序可能會更容易。

private Dictionary<Control, Action> _controlsToActions = new Dictionary<Control, Action>() { 
    { control1, method1 } // one for each control/handler pair 
}; 

private void UIObject_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     _controlsToActions[(Control)sender](); 
    } 
} 

private void UIObject_DoubleClick(object sender, KeyEventArgs e) 
{ 
    _controlsToActions[(Control)sender](); 
} 
+0

我會問最終的開關外殼的訂閱UIObject_KeyDown處理程序方法的所有可能的實例對象,我認爲這與您的建議並不相似,但我不太瞭解C#操作以確定如果您的建議是我在找什麼。 – stackuser83

相關問題