【问题标题】:How is RoutedEventArgs.OriginalSource computed?RoutedEventArgs.OriginalSource 是如何计算的?
【发布时间】:2019-09-19 15:16:11
【问题描述】:

我已阅读herein the MS docs 是通过命中测试确定的,但本问题末尾的示例与此相反,或者我目前理解。

Here我读到它是引发事件的第一个对象,但我不知道这是什么意思,即在下面的示例中。

我目前的理解

鉴于此代码:

private void Handler(object sender, RoutedEventArgs e)
{
    // what does it mean here: sender, e.Source and e.OriginalSource ?
}
  • sender - 处理事件的元素(处理程序附加到该元素)
  • e.Source - 事件开始在可视化树中进行的元素(从上到下,或从下到上)
  • e.OriginalSource - 通过命中测试确定的最深元素,在可视化树中事件开始进展的元素内部

例子

鉴于以下源 XAML 的可视化树:

<StackPanel x:Name="sp" Button.Click="Handler">
    <Button x:Name="btn1">button 1</Button>
    <Button x:Name="btn2">button 2</Button>
    <Button x:Name="btn3" Padding="5">
        <Rectangle Width="100" Height="100" Fill="Blue" x:Name="r"/>
    </Button>
</StackPanel>

和上面一样的处理程序:

private void Handler(object sender, RoutedEventArgs e)
{
    // what does it mean here: sender, e.Source and e.OriginalSource ?
}

当点击时:

  • btn1sender 将是 spe.Source 将是 btn1e.OriginalSource 将是 btn1
  • btn2sender 将是 spe.Source 将是 btn2e.OriginalSource 将是 btn2
  • btn3sender 将是 spe.Source 将是 btn3e.OriginalSource 将是:
    • r如果点击蓝色Rectangle(这里我错了,我不知道为什么)
    • btn3 如果在btn3 中的空间上点击了r

我得到的是e.OriginalSource == btn3,而不是上面列表中最新元素中的r

官方文档是here

谢谢。

【问题讨论】:

    标签: c# wpf mouseevent hittest routed-events


    【解决方案1】:

    Rectangle 不会引发您处理的任何 Button.Click 事件。但是它确实会引发一个MouseLeftButtonDownButton 在内部处理),您可以确认您是否处理了StackPanelPreviewMouseLeftButtonDown,并检查事件处理程序中的OriginalSource 属性。

    【讨论】:

      【解决方案2】:

      你击中的东西开始滚动。

      或者更准确地说。

      事件冒泡。

      路由事件可以在可视化树上冒泡或向下隧道化。

      文档试图解释这一点:

      https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/routed-events-overview

      这意味着您点击了某个内容,然后该内容将成为事件的原始来源。这是首先解决的,因为它将驱动一切。以后不计算了。

      它在视觉树上上下移动,设置的源将取决于您处理事件的位置。

      【讨论】:

        猜你喜欢
        • 2011-10-16
        • 2019-02-03
        • 2018-11-03
        • 2010-11-27
        • 2013-08-17
        • 2010-09-14
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多