如何捕捉鼠标移动时,鼠标左键按下按钮控制和释放不同的按钮控制
本文关键字:控制 鼠标 按钮 释放 移动 何捕捉 | 更新日期: 2023-09-27 18:19:23
我在WPF中创建了一个自定义用户控件,如图所示,我想鼠标左键单击按钮"8",并按住鼠标按钮移动到另一个按钮上,例如:按钮"1"并释放鼠标左键。现在我想得到两个按钮"8"时点击它和"1"时释放按钮。我已经注册了PreviewMouseLeftButtonDown来获取鼠标down事件和PreviewMouseLeftButtonUp来获取鼠标up事件。但是当我点击"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);
}
}
这种行为是由于鼠标被捕获引起的。尝试使用命中测试来获取位于鼠标释放点的元素: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)
在结果中。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)));
}