RoutedEventArgs.Source vs Sender

时间:2011-08-29 21:05:31

标签: wpf events

wpf事件处理中 sender source 之间有什么区别?

例如,假设我在画布上有一个椭圆,并点击了椭圆:椭圆将是发件人

但是如果椭圆不处理事件而主窗口处理事件,则事件将通过画布...因此画布将是主窗口事件的发送者将是椭圆。

我有这个权利吗?

4 个答案:

答案 0 :(得分:17)

两者之间的差异并不常见,因为senderSource通常是相同的。大多数代码都像Windows Forms一样编写,基本上会忽略差异并将它们作为相同的引用发送出来。但是,考虑到WPF的事件路由如何工作,它们代表了两个不同的概念。

sender is the object at which the event handler was attached。这是提升处理程序以开始路由事件的所有者。来自MSDN:

  

发送者和源之间的差异是在通过元素树遍历路由事件期间将事件路由到不同元素的结果。

MSDN: Event routing diagram

Source is the object where the event originates.在隧道和冒泡的情况下,Source将是他们的子元素之一。您可以使用OriginalSource属性来剥离任何事件树封装。

答案 1 :(得分:7)

气泡!

发件人是从中提出事件的对象,而source是导致事件被引发的原始元素。

就像这种情况一样:

<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上的TabControlsender将等于tc1Source将等于tc2 }。

答案 2 :(得分:4)

发件人:处理事件的当前元素

OriginalSource:首次引发事件的原始对象

来源:引发事件的对象。这通常与OriginalSource相同,但在处理Composite Controls时,它可以是包含OriginalSource对象的父级。*

RoutedEvent:为事件处理程序触发的事件(例如静态UIElement.MouseUpEvent对象)提供RoutedEvent对象。如果您使用相同的事件处理程序处理不同的事件,则此信息非常有用。

Handled:允许您暂停事件冒泡或隧道过程。当控件将Handled属性设置为true时,事件不会再行进,也不会针对任何其他元素引发。

答案 3 :(得分:2)

希望这会有所帮助:)

  • RoutedEventArgs.OriginalSource - 首次举起活动的原始对象
  • RoutedEventArgs.Source - 引发事件的对象。这通常与OriginalSource相同,但在处理Composite Controls时,它可以是包含OriginalSource对象的父级。*
  • 发件人 - 处理事件的当前元素
  

*可以调整源的常见情况包括控件的内容模型中的内容元素(例如,列表项的内容将报告列表项元素作为源和列表项中的实际元素将是OriginalSource)。

参考