Подтвердить что ты не робот

RoutedEventArgs.Source vs Sender

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

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

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

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

4b9b3361

Ответ 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).

Ссылки: