WPF 中的 Button.MouseMove 事件始终具有状态为已发布的 e.LeftMouse

问题描述 投票:0回答:2

我正在尝试在 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");
}
c# wpf drag-and-drop
2个回答
1
投票

您也许可以处理

PreviewMouseDown
事件而不是
Click
:

private void Button_Click(object sender, MouseButtonEventArgs e)
{
    //handle click here...

    e.Handled = true;
}

XAML:

<Button PreviewMouseDown="Button_Click" MouseMove="Button_MouseMove"/>

0
投票

谢谢谢谢谢谢谢谢谢谢谢谢谢谢

© www.soinside.com 2019 - 2024. All rights reserved.