【问题标题】:Button.MouseMove event in WPF always has e.LeftMouse with status ReleasedWPF 中的 Button.MouseMove 事件始终具有状态为 Released 的 e.LeftMouse
【发布时间】:2020-10-09 14:00:04
【问题描述】:

我正在尝试在 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 事件的任何控件都是如此。

如何处理从 Button 控件或 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


【解决方案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"/>

【讨论】:

  • 触发异常,但是Click事件不再起作用。
  • 不再工作是什么意思?你不应该处理Click,而是处理PreviewMouseDown。这确实被提出了。
  • 我想我可以使用 PreviewMouseUp 的组合并将我的点击代码放在那里。在 PreviewMouseDown 我记录位置,在 PreviewMouseUp 我检查距离是否足够大以处理我的点击代码。我不想同时处理点击代码和鼠标移动。
  • 为什么不按照我的工作示例将“点击代码”放在PreviewMouseDown 中?
  • 如果我在按下左键后移动鼠标,我不想处理点击代码。您的代码很有帮助。我正在研究解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多