RoutedEventArgs.Source vs Sender - PullRequest
       0

RoutedEventArgs.Source vs Sender

13 голосов
/ 30 августа 2011

В чем разница между sender и source в обработке событий wpf?

Например, скажем, у меня был эллипс на холсте, и я нажал наэллипс: эллипс будет и отправителем , и источником .

Однако, если эллипс не обрабатывает событие, а главное окно, событие будетпройти через холст ... так что холст будет отправителем события в главное окно, но источник будет эллипсом.

Есть ли у меняэто верно?

Ответы [ 4 ]

17 голосов
/ 30 августа 2011

Разница между ними не часто видна, так как обычно sender и Source одинаковы. Большая часть кода, написанного как Windows Forms, в основном игнорирует разницу и отправляет их как одну и ту же ссылку. Однако, учитывая, как работает маршрутизация событий WPF, они представляют две разные концепции.

sender - это объект, к которому прикреплено событие обработчик . Это владелец, который поднял обработчик , чтобы начать маршрутизацию события. Из MSDN:

Разница между отправителем и источником является результатом того, что событие перенаправляется в разные элементы во время прохождения перенаправленного события через дерево элементов.

MSDN: Event routing diagram

Source - это объект, из которого происходит событие . В случае туннелирования и образования пузырьков Source будет одним из их дочерних элементов. Вы можете использовать свойство OriginalSource для очистки любой инкапсуляции дерева событий.

7 голосов
/ 30 августа 2011

Bubbles!

Отправитель - это объект, из которого вызывается событие, тогда как источником был исходный элемент, вызывающий событие.

Как в этом случае:

<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.

4 голосов
/ 16 января 2013

Отправитель: текущий элемент, который обрабатывает событие

OriginalSource: оригинальный объект, который первым вызвал событие

Источник: объект, вызвавший событие. Обычно это то же самое, что и OriginalSource, но при работе с составными элементами управления это может быть родительский объект, содержащий объект OriginalSource. *

RoutedEvent: Предоставляет объект RoutedEvent для события, вызванного вашим обработчиком события (например, статический объект UIElement.MouseUpEvent). Эта информация полезна, если вы обрабатываете разные события одним и тем же обработчиком событий.

Обработано: Позволяет остановить процесс всплытия или туннелирования событий. Когда элемент управления устанавливает для свойства Handled значение true, событие больше не перемещается и не вызывается для других элементов.

2 голосов
/ 28 февраля 2012

Надеюсь, это поможет:)

  • RoutedEventArgs.OriginalSource - исходный объект, который первым вызвал событие
  • RoutedEventArgs.Source - объект, вызвавший событие. Обычно это то же самое, что и OriginalSource, но при работе с составными элементами управления это может быть родительский объект, содержащий объект OriginalSource. *
  • Отправитель - Текущий элемент, обрабатывающий событие

* Распространенные случаи, когда источник может быть скорректирован, включают элементы содержимого внутри модели содержимого для элемента управления (например, содержимое элемента списка будет сообщать элемент элемента списка в качестве источника и фактический элемент в элементе списка будет OriginalSource).

Рекомендации :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...