フォームのコントロールを別のクラスに渡し、そこでコントロールやその親コントロールなどのイベントを作成します。また、ある時点でそれらのイベントをデタッチする必要があります。ただし、イベントが既に添付されている場合は、イベントを複製しないようにする必要があります。
したがって、私は常に次のようなイベントを添付します。
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 だけで対処できます。