事件源与原始源

Event source vs original source

我正在阅读 C# WPF 书籍和路由事件章节,事件有 2 个相同的属性 SourceOriginalSource。我没有看出它们之间的区别:

Xaml:

<Button Name="Ok" Click="Ok_Click"/>

后面的代码:

private void Ok_Click(object sender, RoutedEventArgs e)
{
        bool flag = false;
        var source = e.Source;
        var originalSource = e.OriginalSource;
        if (source == originalSource)
        {
            flag = true;
        }
}

flag 属性 true 在这里,有人可以解释为什么 2 相同 属性 或者在这种情况下这个属性没有效果吗?或者我们在哪里可以看到此属性的用例?

一个控件中可以包含其他控件,如 children。当您从控件订阅事件时,您订阅的 parent 可能是 e.Source 但是如果控件有 children 而 child 是那个引发事件,那么 OriginalSource 将是引发事件的 child。

一个常见的用例是在 DataGrid 上订阅 KeyDown 事件。来源可能是网格,但原始来源可能是单元格(或单元格中的某些组件)