此行为是由鼠标被捕获的事实引起的。尝试使用命中测试来获得位于点的元素,其中鼠标被释放:http://msdn.microsoft.com/en-us/library/ms608752.aspx
UPDATE
在例子中,你有以下布局:
<Window x:Class="WpfApplication24.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Button Content="b1" PreviewMouseLeftButtonUp="Button_PreviewMouseLeftButtonUp_1"/>
<Button Content="b2"/>
</StackPanel>
</Window>
在您的PreviewMouseLeftButtonUp处理程序,你应该执行以下代码:
private void Button_PreviewMouseLeftButtonUp_1(object sender, MouseButtonEventArgs e) {
var result = VisualTreeHelper.HitTest(this, e.GetPosition(this));
}
请注意,您的肩膀d使用HitTest作为您的按钮的常用父元素(例如 - 它是MainWindow)
在result.VisualHit属性中,您可以看到位于光标下方的元素。
后,您可以使用VisualTreeHelper来检查它是否是你的按钮的孩子,或者试试下面的办法:
1)创建一些标志附加属性:
public static bool GetIsHitTestTarget(DependencyObject obj) {
return (bool)obj.GetValue(IsHitTestTargetProperty);
}
public static void SetIsHitTestTarget(DependencyObject obj, bool value) {
obj.SetValue(IsHitTestTargetProperty, value);
}
public static readonly DependencyProperty IsHitTestTargetProperty = DependencyProperty.RegisterAttached("IsHitTestTarget", typeof(bool), typeof(MainWindow), new PropertyMetadata(false));
2)设置它的为元素值,你会发现:
<Button Content="b1" local:MainWindow.IsHitTestTarget="true" PreviewMouseLeftButtonUp="Button_PreviewMouseLeftButtonUp_1"/>
<Button Content="b2" local:MainWindow.IsHitTestTarget="true"/>
3)修改PreviewLeftButtonUp回调:
private void Button_PreviewMouseLeftButtonUp_1(object sender, MouseButtonEventArgs e) {
DependencyObject result = null;
VisualTreeHelper.HitTest(this,
(o)=> {if(GetIsHitTestTarget(o)) {
result = o;
return HitTestFilterBehavior.Stop;
}
return HitTestFilterBehavior.Continue;
},
(res) => HitTestResultBehavior.Stop,
new PointHitTestParameters(e.GetPosition(this)));
}
我已经将此代码添加到我的方法中:Point pt = e.GetPosition((UIElement)sender); //对视觉对象树的给定部分执行命中测试。 HitTestResult result = VisualTreeHelper.HitTest(this.Parent as Visual,pt); if(result == null)return;但我总是得到结果值为空。我已经通过父控件作为可视参考参数,我也试图通过与Visual refence bt相同的控件,在这两种情况下我都得到了空命中结果,还有没有其他方法来获取元素。 –
我修改了我以前的答案,告诉你它是如何工作的 – Alexis
感谢ASerov 的支持。代码正在按照需要工作。 - :) –