事件处理程序未删除
Event Handler not removing
我有一个媒体播放器的路由事件处理程序,可以在媒体播放器打开时触发事件。当我只有一个媒体元素时,我可以很好地删除处理程序。但是,当我单击一次鼠标同时播放两个媒体元素时,它不会删除其中一个事件。变量 '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
为什么我不能删除第二个事件?
因为您正在覆盖您的 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);
}
我有一个媒体播放器的路由事件处理程序,可以在媒体播放器打开时触发事件。当我只有一个媒体元素时,我可以很好地删除处理程序。但是,当我单击一次鼠标同时播放两个媒体元素时,它不会删除其中一个事件。变量 '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
为什么我不能删除第二个事件?
因为您正在覆盖您的 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);
}