RoutedEventArgs.Source与Sender的区别

17
在WPF事件处理中,“sender”和“source”有什么区别?
例如,在画布上有一个椭圆,当单击椭圆时:椭圆既是“sender”,也是“source”。
但是,如果椭圆不处理事件,而是主窗口处理,则事件将通过画布传递... 因此,画布将成为事件的“sender”,发送到主窗口的“source”将是椭圆。
我的理解正确吗?
4个回答

24
两者之间的差异通常不容易看出,因为通常senderSource是相同的。像Windows Forms这样的代码基本上会忽略这种区别,并将它们作为相同的引用发送。但是,考虑到WPF事件路由的工作方式,它们代表两个不同的概念。 sender是附加了处理程序的对象。这是引发处理程序开始路由事件的所有者。来自MSDN:

sender和Source之间的差异是在通过元素树路由事件时,事件被路由到不同的元素产生的结果。

MSDN: Event routing diagram

Source事件发生的对象。 在隧道和冒泡的情况下,Source将是其中一个子元素。您可以使用OriginalSource属性来剥离任何事件树封装。

你提供了一个关于WPF开发的重要问题的清晰答案!听起来不错,是吧? :) - florien
在什么情况下,发送者和源不会是相同的? - Stevoisiak

9

泡泡!

发送者是引发事件的对象,而源是最初导致事件被引发的元素。

就像在这种情况下:

<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)
{
}

在这种情况下,如果您更改子TabControl上的SelectedItemsender将等于tc1Source将等于tc2

5

Sender: 处理事件的当前元素

OriginalSource: 最初引发事件的原始对象

Source: 引发事件的对象。通常情况下与OriginalSource相同,但在处理复合控件时,它可能是包含OriginalSource对象的父对象。

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

Handled: 允许你停止事件冒泡或隧道传递过程。当一个控件将Handled属性设置为true时,该事件不再向下传播,也不会为任何其他元素引发该事件。


4
希望这有所帮助 :)
  • RoutedEventArgs.OriginalSource - 首次引发事件的原始对象
  • RoutedEventArgs.Source - 引发事件的对象。通常与OriginalSource相同,但在处理复合控件时,它可以是包含OriginalSource对象的父级。
  • Sender - 处理事件的当前元素

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

参考资料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接