2013-06-21 35 views
0

我在WPF中创建了一个自定义的用户控件,它显示在附加图像中,我想用鼠标左键单击按钮“8”并按住鼠标按钮在另一个按钮上移动,例如:按钮“1”并释放鼠标左键按钮。现在,我想在点击按钮时获取“8”按钮,在释放按钮时获得“1”。我已经注册了PreviewMouseLeftButtonDown来获取鼠标按下事件,而PreviewMouseLeftButtonUp以获得鼠标按下事件。但是当我点击“8”并在“1”释放按钮上移动时,我都会得到相同的“8”按钮。 任何人都可以请让我知道我怎么能做到这一点。当在按钮控件上按下鼠标左键并在不同按钮控件上释放时如何捕获鼠标移动?

private ToggleButton _startButton; 
private ToggleButton _endButton; 

private void tb_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    _startButton = sender as ToggleButton; 
} 

private void tb_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    _endButton = sender as ToggleButton; 
    if (_endButton != null && _startButton != null) 
    { 
    string start = _startButton.Content.ToString(); 
    string end = _endButton.Content.ToString(); 
    if (!start.Equals(end)) 
     ToggleButton(_endButton); 
    } 
} 

回答

0

此行为是由鼠标被捕获的事实引起的。尝试使用命中测试来获得位于点的元素,其中鼠标被释放: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))); 
} 
+0

我已经将此代码添加到我的方法中:Point pt = e.GetPosition((UIElement)sender); //对视觉对象树的给定部分执行命中测试。 HitTestResult result = VisualTreeHelper.HitTest(this.Parent as Visual,pt); if(result == null)return;但我总是得到结果值为空。我已经通过父控件作为可视参考参数,我也试图通过与Visual refence bt相同的控件,在这两种情况下我都得到了空命中结果,还有没有其他方法来获取元素。 –

+0

我修改了我以前的答案,告诉你它是如何工作的 – Alexis

+0

感谢ASerov 的支持。代码正在按照需要工作。 - :) –

相关问题