1

ダブルクリックイベントにサブスクライブされたさまざまなイベントハンドラーを持つ複数のユーザーインターフェイスオブジェクトを持つユーザーインターフェイスコントロールがあります。たとえば、次のようなキーダウンイベントに応答してそのダブルクリックイベントを発生させる方法はありますか?

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

? VSI によると、「....DoubleClick は -= または += の左側にしか表示されないため、呼び出し可能なメソッドを 2 つの異なる可能な送信者オブジェクト タイプに追加することが私の最も単純な希望のようですが、:.Perform[[ Double]]Click() は dunch よりもはるかに優れています。

4

3 に答える 3

1

いいえ、これは不可能です。イベントは、それらが定義されているタイプからのみトリガーできます。つまり、独自のタイプがない限り(この場合、イベントをトリガーするメソッドを公開できます)。

イベントハンドラーをアタッチする方法によっては、同じハンドラーをすべて追加できるデリゲート/イベントを持つ別のオブジェクトを作成できる場合があります。Controlこれにより、オブジェクトのメソッドの代わりにそれを起動/呼び出すことができます。

于 2013-01-16T17:15:08.640 に答える
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 に答える
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 に答える