WPF маршрутизируемая обработка событий в UserControl - PullRequest
4 голосов
/ 19 сентября 2011

У меня есть WPF UserControl, который содержит кнопку. У меня также есть окно WPF, которое содержит кнопку. И в пользовательском контроле, и в окне я помещаю следующую строку в XAML:

UIElement.PreviewMouseLeftButtonDown="OnPreviewMouseLeftButtonDown"

и в 'OnPreviewMouseLeftButtonDown' я разместил отладочную печать, отображающую args.Source.

Когда я нажимаю на кнопку, которая находится внутри окна, я получаю кнопку как источник EventArgs. Однако, когда я нажимаю кнопку внутри UserControl (которая также находится внутри окна, чтобы я мог проверить его, но не в том же окне), я получаю UserControl как источник EventArgs.

Я устал видеть, есть ли какой-нибудь декоратор вокруг UserControl (используя snoop), но это кажется прямым.

Я не могу понять, что такого особенного в UserControl в WPF, что я не получаю нужного отправителя. Может кто-нибудь объяснить мне, что мне не хватает?

Ответы [ 2 ]

1 голос
/ 19 декабря 2016

Хотя вопрос старый, я недавно столкнулся с аналогичной проблемой, связанной с событием ContextMenuOpening. Некоторый объем поиска дал исходный код UserControl здесь , который содержит следующий раздел:

    // Set the EventArgs' source to be this UserControl 
    internal override void AdjustBranchSource(RoutedEventArgs e)
    {
        e.Source=this;
    } 

Итак, по-видимому, UserControl устанавливает себе источник ЛЮБОГО перенаправленного события. Я понятия не имею, почему это происходит, хотя ...

0 голосов
/ 22 сентября 2011

Используйте e.OriginalSource, как указано выше. Если вам нужно найти кнопку, то вы можете использовать VisualTreeHelper.GetParent, чтобы найти фактический элемент управления Button.

...