0

私はこの方法でイベントを購読しています:

  s1.MouseUp += (s, e) =>
  {
  indexOfPointToMove = -1;
  s1.LineStyle = LineStyle.Solid;
  MyModel.RefreshPlot(false);
   e.Handled = true;
 };

別の範囲で登録を解除するにはどうすればよいですか? (ただし、 の範囲内s1)

私は次のことを試しました:

s1.MouseUp = null;



s1.MouseUp -=(s,e) =>
 {
       indexOfPointToMove = -1;
       s1.LineStyle = LineStyle.Solid;
       MyModel.RefreshPlot(false);
       e.Handled = true;
  };



s1.MouseUp += (s,e) =>
{
//nothing
};

しかし、イベントはまだ発生しています。どうすればこれを行うことができますか?

4

5 に答える 5

1

匿名メソッドはまったく同じものにコンパイルされることが保証されていないため、これはイベントのサブスクライブを解除しません。これは、イベントのサブスクライブ解除の等価性チェックに影響し、サブスクリプションの削除に「失敗」します。

匿名メソッドは、型が既に存在する場合にコンパイラが型の同じ定義を使用する匿名型とは異なります。

イベント ハンドラーを通常のメソッドにするか、匿名メソッドをローカル変数に格納して、代わりにサブスクライブを解除します。

于 2013-07-05T12:25:51.760 に答える
0

(イベントの実行コンテキストのために)ラムダが本当に必要な場合は、次の方法で実行できます。

var act = new Action<object, EventArgs>((e, s) =>
    {
        indexOfPointToMove = -1;
        s1.LineStyle = LineStyle.Solid;
        MyModel.RefreshPlot(false);
        e.Handled = true;
    });

this.MouseUp += act;

...

this.MouseUp -= act;
于 2013-07-05T12:28:09.533 に答える