Вопрос в том, что после всех моих исследований я все еще не могу найти разницу между обычным перенаправленным событием и прикрепленным событием. В чем функциональная разница? Или другие согласны с тем, что есть нет?
Класс ButtonBase объявляет перенаправленное событие с именем ClickEvent; обычное перенаправленное событие.
public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonBase));
[Category("Behavior")]
public event RoutedEventHandler Click
{
add
{
base.AddHandler(ClickEvent, value);
}
remove
{
base.RemoveHandler(ClickEvent, value);
}
}
Класс Mouse объявляет перенаправленное событие с именем MouseDownEvent; присоединенное событие.
public static readonly RoutedEvent MouseDownEvent = EventManager.RegisterRoutedEvent("MouseDown", RoutingStrategy.Bubble, typeof(MouseButtonEventHandler), typeof(Mouse));
public static void AddMouseDownHandler(DependencyObject element, MouseButtonEventHandler handler)
{
UIElement.AddHandler(element, MouseDownEvent, handler);
}
public static void RemoveMouseDownHandler(DependencyObject element, MouseButtonEventHandler handler)
{
UIElement.RemoveHandler(element, MouseDownEvent, handler);
}
Оба события регистрируются в EventManager и сохраняются как общедоступные, статические поля, доступные только для чтения, одинаковым образом. ClickEvent имеет резервное поле события CLR с настраиваемыми средствами доступа добавления и удаления, которые вызывают соответственно base.AddHandler и base.RemoveHandler; оба из них объявлены в базовом классе UIElement, от которого наследуется ButtonBase. MouseDownEvent вместо этого имеет два статических метода AddMouseDownHandler и RemoveMouseDownHandler, которые в конечном итоге вызывают те же два метода AddHandler и RemoveHandler, объявленные в UIElement, точно так же, как ClickEvent.
Статические методы Add * Handler и Remove * Handler для фактических присоединенных событий, объявленных в статическом классе, должны следуйте определенному соглашению об именах, чтобы позволить системе событий WPF использовать отражение для поиска подходящих обработчиков добавления и удаления во время выполнения.
Оба события могут иметь обработчики, прикрепленные в XAML следующим образом:
Оба события могут быть присоединены в коде следующим образом:
// Attach ClickEvent handler.
myGrid.AddHandler(Button.ClickEvent, new RoutedEventHandler(Grid_Click));
// Attach MouseDownEvent handler.
Mouse.AddMouseDownHandler(myGrid, Grid_MouseDown);
Как видите, оба события могут быть прикреплены к элементам, которые не владеют ими или не объявляют их.
В документации MSDN указано: http://msdn.microsoft.com/en-us/library/bb613550.aspx
Расширяемый язык разметки приложений (XAML) определяет языковой компонент и тип события, называемого прикрепленным событие. Понятие прикрепленного событие позволяет добавить обработчик для конкретное событие к произвольному элемент, а не элемент, который фактически определяет или наследует событие. В этом случае ни объект, потенциально вызывающий событие ни экземпляр обработки назначения определяет или иным образом «владеет» событием.
Кроме того, в официальном учебном комплекте MCTS для экзамена 70-511 - Разработка приложений Windows с помощью Microsoft .NET Framework 4 говорится:
Элемент управления может определять обработчик события, которое сам контроль не может поднять. Эти инциденты называются присоединенными событиями. Например, рассмотрим элементы управления Button в сетке. Класс Button определяет Click событие, но класс Grid делает не. Однако вы все равно можете определить обработчик кнопок в сетке присоединение события Click для Элемент управления «Кнопка» в коде XAML.
Термин «присоединенное событие» кажется размытым во всех учебных ресурсах Microsoft, хотя ясно, что здесь задействованы две разные, но очень тесно связанные концепции: присоединенные события и синтаксис присоединенного события XAML. . Оба источника Microsoft, которые я процитировал, похоже, относятся к синтаксису прикрепленных событий XAML, а не к фактическим присоединенным событиям. Тем не менее, страница MSDN с обзором прикрепленных событий продолжает показывать вам, как реализовать фактическое присоединенное событие, в отличие от обучающего набора.
Mouse.MouseDownEvent - это пример перенаправленного события, объявленного в статическом классе с соответствующим статические обработчики добавления и удаления, также известные как присоединенное событие. Однако ButtonBase.ClickEvent является обычным перенаправленным событием, хотя его все еще можно использовать с синтаксисом присоединенного события XAML таким же образом, как и фактическое присоединенное событие.
Цель фактического присоединенного события состоит в том, что оно позволяет разработчикам объявлять новое перенаправленные события для существующих классов, производных от UIElement, без необходимости их подкласса; это означает, что вы можете просто присоединять новые перенаправленные события без их фактического существования в классах, которые вы хотите вызвать или обработать. Но подождите ... разве это не основная цель чисто перенаправленного события?
На странице обзора перенаправленных событий в MSDN указано: http://msdn.microsoft.com/ en-us / library / ms742806.aspx
Функциональное определение:Перенаправленное событие это тип события, которое может вызывать обработчики на нескольких слушателях в дерево элементов, а не только на объект, который вызвал событие.
Из этого функционального определения кажется, что любое перенаправленное событие по существу обеспечивает те же точные функции, что и присоединенное событие. Таким образом, в основном присоединенное событие - это просто средство для объявления перенаправленного события в статическом классе и на самом деле не предлагает никаких преимуществ по сравнению с обычными перенаправленными событиями.
Сообщите мне, как вы думаете, так как я могу что-то здесь упустить.
Спасибо, Тим Валентайн