我正在尝试在 WPF 中的 Button 控件上开始拖放。我使用 Button 因为我也想处理点击事件。
在 XAML 中添加按钮并处理 MouseMove 事件始终使
e.LeftMouse
等于 MouseButtonState.Released
。
<Button MouseMove="Button_MouseMove"/>
在以下处理程序实现中,永远不会抛出异常。
private void Button_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
throw new Exception("It works!");
}
我注意到对于放置在 Button 内并尝试处理 MouseMove 事件的任何控件也是如此。
如何处理 WPF 中按钮控件或按钮内任何其他控件的拖放操作?
编辑 - 基于 mm8 的答案的解决方案
更新后的 XAML 为:
<Button PreviewMouseDown="Button_PreviewMouseDown"
PreviewMouseUp="Button_PreviewMouseUp"
PreviewMouseMove="Button_PreviewMouseMove">
</Button>
更新后的处理程序代码:
Point startPosition;
double delta = 10;
private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
startPosition = e.GetPosition(this);
}
private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
Point currentPosition = e.GetPosition(this);
if ((currentPosition - startPosition).Length < delta)
throw new Exception("MouseClick");
}
private void Button_PreviewMouseMove(object sender, MouseEventArgs e)
{
Point currentPosition = e.GetPosition(this);
double currentDelta = (currentPosition - startPosition).Length;
if (e.LeftButton == MouseButtonState.Pressed && currentDelta >= delta)
throw new Exception("DragAndDrop");
}
您也许可以处理
PreviewMouseDown
事件而不是 Click
:
private void Button_Click(object sender, MouseButtonEventArgs e)
{
//handle click here...
e.Handled = true;
}
XAML:
<Button PreviewMouseDown="Button_Click" MouseMove="Button_MouseMove"/>
谢谢谢谢谢谢谢谢谢谢谢谢谢谢