【问题标题】:How to handle both `MouseLeftButtonUp`and `MouseDoubleClick` mouse events?如何处理“MouseLeftButtonUp”和“MouseDoubleClick”鼠标事件?
【发布时间】:2017-05-19 18:20:51
【问题描述】:

我想同时处理Image 上的MouseLeftButtonUp 和MouseDoubleClick 事件。我将galasoft mvvm light 库用于EventToCommand。但是,MouseDoubleClick 没有被调用。实际上,它被称为,但非常罕见。为什么会发生这种情况以及如何解决?

<ContentControl>
    <Image Source = "{Binding Img}" Stretch="Fill" />

    <i:Interaction.Triggers>
        <i:EventTrigger EventName = "MouseLeftButtonUp" >
            < cmd:EventToCommand Command = "{Binding MouseUpCommand}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
        <i:EventTrigger EventName = "MouseDoubleClick" >
            < cmd:EventToCommand Command = "{Binding DoubleClickCommand}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ContentControl>



private ICommand _doubleClickCommand;
public ICommand DoubleClickCommand
{
    get
    {
        if (_doubleClickCommand== null)
        {
            _doubleClickCommand=new RelayCommand<MouseEventArgs>(DoubleClikcFunc);
        }

        return _doubleClickCommand;
    }
}

private ICommand _mouseUpCommand;
public ICommand MouseUpCommand
{
    get
    {
        if (_mouseUpCommand== null)
        {
            _mouseUpCommand= new RelayCommand<MouseEventArgs>(MouseUpFunc);
        }

        return _mouseUpCommand;
    }
}

private void MouseUpFunc(MouseEventArgs e)
{
    Points.Add(e.GetPosition((IInputElement)e.Source));
}

private void DoubleClikcFunc(MouseEventArgs e)
{
    Points.Add(MaskPoints[0]);
}

【问题讨论】:

  • 看看这篇区分点击和双击的 MSDN 文章:msdn.microsoft.com/en-us/library/ms171543.aspx
  • 我使用 WPF 而不是 Windows 窗体。我确信 WPF 应该有一些内置的或更简单的解决方案。
  • 您将事件附加到 ContentControl 而不是 Image。
  • 为什么我被否决了?
  • @Naresh Ravlani,你投票结束了吗?为什么?我有一个错误,这是我可以发布并有第二双眼睛检查问题所在的地方。

标签: c# wpf mvvm mouseevent


【解决方案1】:

双击的第二次单击定义总是在单击之前,因此您最好单独处理MouseLeftButtonDown 事件并检查EventArgs 的ClickCount 属性判断是否有双击:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseLeftButtonDown" >
        <cmd:EventToCommand Command = "{Binding MouseUpCommand}" PassEventArgsToCommand="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>

private ICommand _mouseUpCommand;
public ICommand MouseUpCommand
{
    get
    {
        if (_mouseUpCommand == null)
        {
            _mouseUpCommand = new RelayCommand<MouseButtonEventArgs>(MouseUpFunc);
        }

        return _mouseUpCommand;
    }
}

private void MouseUpFunc(MouseButtonEventArgs e)
{
    if (e.ClickCount == 2)
        Debug.Write("double");
    else
        Debug.Write("single");
}

如果您不想处理前面的单击,您可以使用计时器等待 200 毫秒,以查看在您实际处理事件之前是否还有其他单击:

How do we separate click and double click on listview in WPF application?

【讨论】:

  • 我也试过这个。它永远不会去'Write("double")`。
  • 如果你点击的速度足够快,它应该是 :) 它当然对我有用。确保在 ClickCount
  • 我写了一个非常简单的代码作为例子。它除了绑定到command 之外什么都没有,它仍然不会在double 处停止。你可以在你的电脑上试试吗?
  • 您应该按照我的回答处理 MouseLeftButtonDown 事件。它当然接受 MouseButtonEvent。你真的抄了我的示例代码吗?
【解决方案2】:

您必须将触发器放在图像标签之间。现在您将点击事件绑定到 UserControl。

这是一个使用普通 WPF InputBindings 的示例:

        <Image Source = "{Binding Img}" Stretch="Fill">
            <Image.InputBindings>
                <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />
                <MouseBinding MouseAction="LeftClick" Command="{Binding MouseUpCommand}" />
            </Image.InputBindings>
        </Image>

【讨论】:

  • 它和我的例子一样。无论双击,MouseUpCommand 都会被调用。
  • 当然。再次阅读我的答案:双击的第二次单击按定义总是在单击之前。
猜你喜欢
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多