我有一个包含按钮的WPF UserControl。我还有一个包含按钮的WPF窗口。 在UserControl和Window中,我将以下行放在XAML中:
UIElement.PreviewMouseLeftButtonDown="OnPreviewMouseLeftButtonDown"
并在'OnPreviewMouseLeftButtonDown'中放置了一个显示args.Source的调试打印。
当我点击窗口内的按钮时,我将按钮作为EventArgs源。但是,当我单击UserControl内部的按钮(也在窗口内,所以我可以测试它,但不是同一个窗口)时,我将UserControl作为EventArgs源。
我厌倦了看看UserControl周围是否有一些装饰器(使用snoop),但它似乎很直接。
我无法理解WPF中UserControl的特殊之处在于我没有得到正确的发件人。有人可以向我解释一下我错过了什么吗?
答案 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控件。