0

フォームのコントロールを別のクラスに渡し、そこでコントロールやその親コン​​トロールなどのイベントを作成します。また、ある時点でそれらのイベントをデタッチする必要があります。ただし、イベントが既に添付されている場合は、イベントを複製しないようにする必要があります。

したがって、私は常に次のようなイベントを添付します。

internal static void X(Control c, MouseEventHandler mouseDownEvent)
{
    c.TopLevelControl.MouseDown -= mouseDownEvent;
    c.TopLevelControl.MouseDown += mouseDownEvent;
}

ここで、他のハンドラーにも同様のイベントを添付する必要があります。たとえば、

internal static void X(Control c, EventHandler event)
{
    c.Enter -= event;
    c.Enter += event;
}

今、私はこれ-=をあちこちにスプレーしたく+=ありません。代わりに、1 つの単純なユーティリティ関数を用意して、どこでも呼び出すことができるようにしたいと考えています。

何かのようなもの:

internal static void AttachEvent(this Control c, 
                                 Func<Control, MouseEventHandler> e, 
                                 MouseEventHandler m)
{
    e(c) -= m;
    e(c) += m;
}

私が呼び出すことができるように:

AttachEvent(c, control => control.MouseDown, mouseDownEvent);

しかし、これはコンパイルされません.2つのエラーが発生します:

The event 'System.Windows.Forms.Control.MouseDown' can only appear on the left hand side of += or -=

The left-hand side of an assignment must be a variable, property or indexer

入力引数として任意のイベントを取得したいAttachEventのですが、それが複雑すぎる場合は、MouseEvents だけで対処できます。

4

1 に答える 1

1

これは不可能だと思います。C# のイベントは、プロパティのように、add と remove の 2 つのメソッドで構成されます。したがって、頭の中で2つの方法でイベントを展開すると

e.add_MouseOver(Delegate)
e.remove_MouseOver(Delegate) 

イベントへの参照を渡して、他のメソッドで何かを行うことはできないことがわかります。

また、+= は C# 構文の一部であり、式の左側でイベントを参照する場合にのみ機能します。

于 2012-09-22T10:39:33.217 に答える