鼠标按键在按钮控件上按下并在不同按钮控件上释放时如何捕捉鼠标移动?

时间:2013-06-21 03:32:13

标签: c# wpf

我在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);
  }
}

1 个答案:

答案 0 :(得分:0)

此行为是由捕获鼠标的事实引起的。尝试使用命中测试来获取位于释放鼠标的位置的元素:http://msdn.microsoft.com/en-us/library/ms608752.aspx

<强>更新

在示例中,您有以下布局:

<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));            
}

请注意,您应该将HitTest用作两个按钮的公共父元素(例如,它是MainWindow)

在result.VisualHit属性中,您可以看到位于光标下的元素。

之后,您可以使用VisualTreeHelper检查它是否是Button的子项,或者尝试以下方法:

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)));
}