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]]Click() 会比 dunch 好得多。

4

3 回答 3

1

不,这是不可能的。事件只能从定义它们的类型触发。也就是说,除非您有自己的类型(在这种情况下,您可以公开触发事件的方法)。

根据您附加事件处理程序的方式,您可以创建一个单独的对象,该对象具有一个委托/事件,所有相同的处理程序也可以添加到该对象;这将允许您触发/调用它而不是Control对象的方法。

于 2013-01-16T17:15:08.640 回答
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]();
}
于 2013-01-16T17:19:16.900 回答
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
 }
于 2013-01-16T16:55:21.940 回答