WPF Attached Events vs Non -Attached Events

Вопрос в том, что после всех моих исследований я все еще не могу найти разницу между обычным перенаправленным событием и прикрепленным событием. В чем функциональная разница? Или другие согласны с тем, что есть нет?

Реализация

Класс 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

Функциональное определение:Перенаправленное событие это тип события, которое может вызывать обработчики на нескольких слушателях в дерево элементов, а не только на объект, который вызвал событие.

Из этого функционального определения кажется, что любое перенаправленное событие по существу обеспечивает те же точные функции, что и присоединенное событие. Таким образом, в основном присоединенное событие - это просто средство для объявления перенаправленного события в статическом классе и на самом деле не предлагает никаких преимуществ по сравнению с обычными перенаправленными событиями.

Сообщите мне, как вы думаете, так как я могу что-то здесь упустить.

Спасибо, Тим Валентайн

25
задан Tim Valentine 2 June 2011 в 20:02
поделиться