RoutedEventArgs.Source vs Sender

mih*_*jlv 13 wpf events

wpf事件处理中发送方之间有什么区别?

例如,假设我在画布中有一个椭圆,并点击椭圆:椭圆将既是发送者也是.

但是,如果椭圆不处理该事件,但主窗口呢,该事件将通过画布...所以画布将是发送者的事件的主窗口,但将是椭圆形.

我有这个权利吗?

use*_*116 18

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

sender是附加事件处理程序的对象.这是提升处理程序以开始路由事件的所有者.来自MSDN:

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

MSDN:事件路由图

Source事件发生的对象.在隧道和冒泡的情况下,Source它将是他们的子元素之一.您可以使用该OriginalSource属性剥离任何事件树封装.


fat*_*tty 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>
Run Code Online (Sandbox Code Playgroud)
private void tc1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您更改SelectedItem上的子TabControl,sender将等于tc1,Source将相等tc2.


Moh*_*Ali 5

发送者:当前处理事件的元素

\n\n

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

\n\n

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

\n\n

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

\n\n

已处理:允许您停止事件冒泡或隧道过程。当控件将 Handled 属性设置为 true 时,该事件不会进一步传播,并且不会为任何其他元素引发该事件。

\n