WPF在UserControl中路由事件处理

时间:2011-09-19 12:37:29

标签: wpf user-controls routed-events

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

UIElement.PreviewMouseLeftButtonDown="OnPreviewMouseLeftButtonDown"

并在'OnPreviewMouseLeftButtonDown'中放置了一个显示args.Source的调试打印。

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

我厌倦了看看UserControl周围是否有一些装饰器(使用snoop),但它似乎很直接。

我无法理解WPF中UserControl的特殊之处在于我没有得到正确的发件人。有人可以向我解释一下我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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