Как рассчитывается RoutedEventArgs.OriginalSource? - PullRequest
0 голосов
/ 19 сентября 2019

Я прочитал здесь и в MS docs , что это определяется тестированием попаданий, но пример в конце этого вопроса против этого, или я так понимаю, в настоящее время.

Здесь Я прочитал, что это первый объект, вызвавший событие, и я не знаю, что это значит, то есть в приведенном ниже примере.

Мое текущее понимание

Учитывая этот код:

private void Handler(object sender, RoutedEventArgs e)
{
    // what does it mean here: sender, e.Source and e.OriginalSource ?
}
  • отправитель - элемент, который обрабатывает событие (к которому присоединен обработчик)
  • 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 ?
}

При нажатии на:

  • btn1: sender будет sp, e.Source будет btn1, e.OriginalSource будет btn1
  • btn2: sender будет sp, e.Source будет btn2, e.OriginalSource будет btn2
  • btn3: sender будет sp, e.Source будет btn3, e.OriginalSource будет:
    • r, если щелчок сделан по синему Rectangle(здесь я ошибся и не знаю почему)
    • btn3, если щелчок сделан по пробелу в btn3 вокруг r

Вместо r в последнем элементе в списке выше, я получаю e.OriginalSource == btn3.

Официальные документы: здесь .

Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Rectangle не вызывает ни одного события Button.Click, которое вы обрабатываете.Однако он вызывает MouseLeftButtonDown (что Button обрабатывает внутри), что вы можете подтвердить, если вы обработаете PreviewMouseLeftButtonDown StackPanel и отметите свойство OriginalSource в обработчике событий.

0 голосов
/ 19 сентября 2019

То, что вы нажали, запускает вращение шара.

Или, если быть более точным.

Пузырьки событий.

Маршрутные события могут пузыриться в визуальном дереве или туннеле.вниз.

Документы пытаются объяснить это:

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

Это означает, что вы щелкаете что-то, что затем становится исходным источником события.Это решается в первую очередь, потому что это будет управлять всем.Это не вычисляется позже.

Это своего рода перемещение вверх и вниз по визуальному дереву, и от того, какой источник будет установлен, будет зависеть, где вы обрабатываете событие.

...