Обработчик событий не удаляется
У меня есть перенаправленный обработчик событий для медиапроигрывателя, который запускает событие при его открытии. Когда у меня есть только один медиа-элемент, я могу просто удалить обработчик. Однако, когда я играю два медиа-элемента одновременно одним щелчком мыши, это не удалит одно из событий. Переменная 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 ответ
Решение
Потому что вы перезаписываете 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);
}