используя WPF 4.5 Generic Weak Event Manager для обработанных маршрутизируемых событий?

Я хотел бы знать, как преобразовать подписку «Обработанных» RoutedEvents в WeakEventManager?

UIElement имеет следующий метод для подписки на «обработанные» RoutedEvents: UIElement.AddHandler(RoutedEvent routedEvent, обработчик делегата, bool handledEventsToo)

Итак, как мне преобразовать его в форму Generic WeakEventManager?


person icube    schedule 02.09.2013    source источник
comment
Насколько я понимаю, WPF реализует большинство своих событий с помощью WeakEventManagers. Не могли бы вы выложить код, показывающий, как вы обычно подключаете события?   -  person Aron    schedule 02.09.2013
comment
как я упоминал в посте, я бы использовал этот метод для прослушивания событий, даже если они обрабатываются: UIElement.AddHandler(RoutedEvent routedEvent, обработчик делегата, bool handledEventsToo). Я хотел бы знать, можно ли использовать общую форму класса WeakEventManager для этого   -  person icube    schedule 04.09.2013
comment
Насколько я понимаю, страница msdn, на которой представлены менеджеры слабых событий, будет медленнее, чем использование неуниверсального менеджера.   -  person Aron    schedule 04.09.2013


Ответы (1)


Вы должны быть в состоянии просто следовать руководству по созданию пользовательского диспетчера событий из MSDN и реализовать StartListening и StopListening следующим образом:

protected override void StartListening(object source) {
    var sourceElement = (UIElement)source;
    sourceElement.AddHandler(RoutedEvent, OnRoutedEvent, true);
}

protected override void StopListening(object source) {
    var sourceElement = (UIElement)source;
    sourceElement.RemoveHandler(RoutedEvent, OnRoutedEvent, true);
}

Я не думаю, что имеет смысл использовать для этого общий WeakEventManager, потому что он использует имя события и вызывает Type.GetEvent внутри, что совершенно бесполезно, когда вы используете RoutedEvents и AddHandler вместо "настоящих" событий. Однако вы можете написать свой собственный универсальный базовый класс для работы с RoutedEvents.


Лично я использую собственное решение для слабых событий, основанное на WeakEventHandler Дастина Кэмпбелла. Самое приятное в этом то, что вместо внутреннего управления добавлением и удалением он дает вам «слабую» версию исходного делегата, которую вы можете свободно передавать... поэтому нет необходимости настраивать реализацию слабого менеджера событий при добавлении делегирует по-разному, потому что использование одинаково в обоих случаях:

uielement.MouseDown += weakMouseDownHandler;

uielement.AddHandler(UIElement.MouseDownEvent, weakMouseDownHandler, true);
person nmclean    schedule 13.09.2013
comment
Ссылка на решение Дастина мертва. - person Crono; 08.04.2016
comment
@Crono Нашел еще одну копию здесь - searchcode.com/codesearch/view/27835026 - person nmclean; 08.04.2016
comment
@Crono Я исправил ссылку в ответе - person torvin; 30.04.2018