4

我有一个包含按钮的 WPF UserControl。我还有一个包含按钮的 WPF 窗口。在 UserControl 和 Window 中,我将以下行放在 XAML 中:

UIElement.PreviewMouseLeftButtonDown="OnPreviewMouseLeftButtonDown"

在“OnPreviewMouseLeftButtonDown”中,我放置了一个显示 args.Source 的调试打印。

当我单击窗口内的按钮时,我将按钮作为 EventArgs 源。但是,当我单击 UserControl 内的按钮(它也在一个窗口内,所以我可以测试它,但不是同一个窗口)时,我将 UserControl 作为 EventArgs 源。

我很想看看 UserControl 周围是否有一些装饰器(使用 snoop),但它看起来很简单。

我无法理解 WPF 中的 UserControl 有什么特别之处,以至于我没有找到正确的发件人。有人可以向我解释我错过了什么吗?

4

2 回答 2

1

虽然这个问题很老,但我自己最近遇到了一个类似的问题,涉及 ContextMenuOpening 事件。一些搜索产生了 UserControl here的源代码,其中包含以下部分:

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

因此,显然 UserControl 将任何路由事件的源设置为自身。我不知道它为什么会这样,虽然......

于 2016-12-19T12:17:04.237 回答
0

e.OriginalSource如上所述使用。如果需要查找按钮,则可以使用VisualTreeHelper.GetParent查找实际的 Button 控件。

于 2011-09-21T20:02:24.693 回答