Обработчик событий не удаляется - PullRequest
0 голосов
/ 03 октября 2018

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

Поскольку вы перезаписываете поле 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);
}
...