RoutedEventArgs.Source vs Sender
В чем разница между отправителем и источником в обработке событий wpf?
Например, скажем, что у меня был эллипс на холсте, и нажал на эллипс: эллипс был бы как отправителем, так и источником.
Однако, если эллипс не обрабатывает событие, но основное окно делает это, событие пройдет через холст... поэтому холст будет отправителем события в главное окно, но источником будет эллипс.
Есть ли у меня это право?
Ответы
Ответ 1
Различие между ними часто не наблюдается, так как обычно sender
и Source
совпадают. Большинство кода, написанных как Windows Forms, в основном игнорируют разницу и отправляют их как одну и ту же ссылку. Однако, учитывая, как работает маршрутизация событий WPF, они представляют собой две разные концепции.
sender
- это объект, в который было добавлено событие обработчик. Это владелец, который поднял обработчик, чтобы начать маршрутизацию события. Из MSDN:
Разница между отправителем и источником является результатом того, что событие маршрутизируется на разные элементы во время обхода маршрутизируемого события через дерево элементов.
![MSDN: Event routing diagram]()
Source
- это объект, в котором происходит событие . В случае туннелирования и барботажа Source
будет одним из их дочерних элементов. Вы можете использовать свойство OriginalSource
, чтобы отключить инкапсуляцию дерева событий.
Ответ 2
Пузыри!
Отправитель - это объект, из которого возникает событие, тогда как источником был исходный элемент, вызывающий событие.
Как в этом случае:
<TabControl Name="tc1" SelectionChanged="tc1_SelectionChanged">
<TabItem Header="1">
<TabControl Name="tc2">
<TabItem Header="1" />
<TabItem Header="2" />
</TabControl>
</TabItem>
<TabItem Header="2" />
</TabControl>
private void tc1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
В этом случае, если вы измените SelectedItem
на Sub TabControl
, sender
будет равно tc1
, Source
будет равно tc2
.
Ответ 3
Отправитель: текущий элемент, обрабатывающий событие
OriginalSource: исходный объект, который первым поднял событие
Источник: объект, который поднял событие. Обычно это то же самое, что и OriginalSource, но при работе с Composite Controls это может быть родительский объект, содержащий объект OriginalSource. *
RoutedEvent: Предоставляет объект RoutedEvent для события, инициированного обработчиком событий (например, статический объект UIElement.MouseUpEvent). Эта информация полезна, если вы обрабатываете разные события с помощью одного обработчика событий.
Обработан: Позволяет остановить процесс барботирования или туннелирования событий. Когда элемент управления присваивает свойству Handled значение true, событие больше не перемещается и не создается для каких-либо других элементов.
Ответ 4
Надеюсь, что это поможет:)
- RoutedEventArgs.OriginalSource - оригинальный объект, который впервые поднял событие
- RoutedEventArgs.Source - объект, который вызвал событие. Обычно это то же самое, что и у OriginalSource, но при работе с Composite Controls он может быть родителем, который содержит объект OriginalSource. *
- Отправитель - текущий элемент, обрабатывающий событие
* Общие случаи, когда источник может быть скорректирован, включают элементы контента внутри модели контента для элемента управления (например, содержимое элемента списка будет сообщать элемент элемента списка как источник и фактический элемент в элементе списка будет OriginalSource).
Ссылки: