代码之家  ›  专栏  ›  技术社区  ›  nikotromus

未删除事件处理程序

  •  0
  • nikotromus  · 技术社区  · 6 年前

    我有一个路由事件处理程序,用于媒体播放器在媒体播放器打开时触发事件。当我只有一个媒体元素时,我可以移除处理程序。但是,当我用鼠标单击一次播放两个媒体元素时,它不会删除其中一个事件。变量“selzonebolist”为列表中的每个索引存储不同的媒体元素。

    以下是我添加活动的位置:

    RoutedEventHandler mediaOpenedHandler;
    List<RoutedEventHandler> delegateList = new List<RoutedEventHandler>();
    private void playPlayerCrowdFile(int index) {
         mediaOpenedHandler = (sender, e) => 
         InterruptMediaElement_MediaOpened(sender, e, index);
         selZoneBOList[index].InterruptMediaElement.MediaOpened += mediaOpenedHandler;
         delegateList.Add(mediaOpenedHandler);
    }
    

    事件方法如下:

    private void InterruptMediaElement_MediaOpened(object sender, RoutedEventArgs e, int index) {
         Console.WriteLine("count before " + delegateList.Count);
         selZoneBOList[index].InterruptMediaElement.MediaOpened -= mediaOpenedHandler;
         delegateList.Remove(mediaOpenedHandler);
         Console.WriteLine("count after " + delegateList.Count);
    }
    

    输出如下:

    2点前数,

    数到1之后,

    1点前数,

    1后计数

    为什么我不能删除第二个事件?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Rand Random    6 年前

    因为你在重写你的 mediaOpenedHandler 字段。

    既然您的方法是基于索引的,那么这个如何:

    Dictionary<int, RoutedEventHandler> delegateList = new Dictionary<int, RoutedEventHandler>();
    private void playPlayerCrowdFile(int index)
    {
         var mediaOpenedHandler = (sender, e) => 
         InterruptMediaElement_MediaOpened(sender, e, index);
         selZoneBOList[index].InterruptMediaElement.MediaOpened += mediaOpenedHandler;
         delegateList.Add(index, mediaOpenedHandler);
    }
    
    private void InterruptMediaElement_MediaOpened(object sender, RoutedEventArgs e, int index)
    {
         Console.WriteLine("count before " + delegateList.Count);
         selZoneBOList[index].InterruptMediaElement.MediaOpened -= delegateList[index];
         delegateList.Remove(index);
         Console.WriteLine("count after " + delegateList.Count);
    }
    
    推荐文章