1

私はこのようなイベントを購読します:

private void CoupleOverlay(IMapVisual mapVisual)
{            
      overlay.DrawTilesProgressChanged += (s, e) => 
      {               
          mapVisual.DrawingProgress = e.ProgressPercentage;
      };
}

アプリケーションはCoupleOverlayイベントを何度も呼び出す可能性があるため、DrawTilesProgressChangedイベントのサブスクライブを解除して再度サブスクライブする必要がありますが、匿名イベントであるため、サブスクライブを解除できません。私はに変換しようとしました

private void CoupleOverlay(IMapVisual mapVisual)
{
    overlay.DrawTilesProgressChanged -=overlay_DrawTilesProgressChanged;                 
    overlay.DrawTilesProgressChanged +=overlay_DrawTilesProgressChanged;                 
}

private void overlay_DrawTilesProgressChanged(object sender, DrawTilesProgressChangedTileOverlayEventArgs e)
{       
    mapVisual.DrawingProgress = e.ProgressPercentage;
}

メソッドのmapVisual有効な変数ではないため、機能していません。overlay_DrawTilesProgressChanged

コードをに変更した場合

private void CoupleOverlay(IMapVisual mapVisual)
{
    EventHandler<DrawTilesProgressChangedTileOverlayEventArgs> drawEvent = (s, e) =>
    {           
        mapVisual.DrawingProgress = e.ProgressPercentage;
    };

    overlay.DrawTilesProgressChanged -= drawEvent;
    overlay.DrawTilesProgressChanged += drawEvent;
}

ローカル変数が原因で機能しませんdrawEvent。次にCoupleOverlayを呼び出すと、新しい変数が作成されます。

では、どうすればこのイベントハンドラーの購読を解除できますか?または、イベントに登録していることを確認して、再度登録する必要がないようにするにはどうすればよいですか?

4

2 に答える 2

1

drawEvent がローカル変数であるため機能しません。次に CoupleOverlay を呼び出すと、新しい変数が作成されます。

それはそう。基本的に、ローカル変数ではなくインスタンス変数を保持する必要があります。インスタンス変数は、実質的に「現在サブスクライブされているイベント ハンドラー」になります。次に、CoupleOverlayそのイベント ハンドラーを削除し、新しいハンドラーを作成して (変数に格納)、再サブスクライブします。

別の方法は、単一のイベント ハンドラーを使用することですが、イベント ハンドラーによって使用されるインスタンス変数として「現在の」オーバーレイとマップ ビジュアルを保持します。メソッドは、CoupleOverlayこれらの変数を更新するだけで済みます。

于 2012-05-16T14:23:44.747 に答える