事件处理程序未删除

时间:2018-10-03 14:48:29

标签: c# events routed-events

我有一个路由事件处理程序,供媒体播放器在媒体播放器打开时触发事件。当我只有一个media元素时,我可以删除处理程序。但是,当我单击一次鼠标一次播放两个媒体元素时,它不会删除其中一个事件。变量“ 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 个答案:

答案 0 :(得分:2)

因为您要覆盖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);
}