UIElement.AddHandler() vs .Event + = Определение

1. часть запроса: В чем разница между этими двумя регистрациями событий?

_popUp.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(PopUp_PreviewMouseLeftButtonDown));

_popUp.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(_popUp_PreviewMouseLeftButtonDown);

2. часть вопроса: или в конечном итоге против

popUp.Opened += PopUp_Opened;

Ответ 1

Согласно Redgate Reflector, нет никакой разницы. Оба метода в конечном итоге вызывают внутренний метод EventHandlerStore.AddRoutedEventHandler. Это выход отражателя для add аксессуара add для события PreviewMouseLeftButtonDown (в классе UIElement):

public void add_PreviewMouseLeftButtonDown(MouseButtonEventHandler value)
{
    this.AddHandler(PreviewMouseLeftButtonDownEvent, value, false);
}

Как вы видите, он вызывает UIElement.AddHandler для вас.

Прежде чем вы редактируете свой вопрос, вы спрашивали о событии Opened всплывающего окна. В этом случае есть разница: во-первых, событие Opened не реализовано как маршрутизируемое событие, а как простое событие, поэтому вы даже не можете использовать вызов AddHandler на нем. Во-вторых, рефлектор показывает, что в EventHandlerStore вызывается другой метод, который добавляет обработчик к простой коллекции делегатов.

Ответ 2

Важным может быть AddHandler(xxx,xxx, false).

Если вы используете true, вы можете поймать события, которые уже были обработаны, что может быть полезно, если вы подклассифицируете элементы управления, такие как TextBox.