Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理'MouseLeftButtonUp'和'MouseDoubleClick'鼠标事件?_C#_Wpf_Mvvm_Mouseevent - Fatal编程技术网

C# 如何处理'MouseLeftButtonUp'和'MouseDoubleClick'鼠标事件?

C# 如何处理'MouseLeftButtonUp'和'MouseDoubleClick'鼠标事件?,c#,wpf,mvvm,mouseevent,C#,Wpf,Mvvm,Mouseevent,我想处理图片上的mouseleftbuttonnu和MouseDoubleClick事件。我将galasoft mvvm light库用于EventToCommand。但是,MouseDoubleClick不被称为。实际上,它被称为,但非常罕见。为什么会发生这种情况以及如何解决 <ContentControl> <Image Source = "{Binding Img}" Stretch="Fill" /> <i:Interaction.Trig

我想处理图片上的mouseleftbuttonnu和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]);
}

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

以下是正常WPF输入绑定的示例:

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

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

<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseLeftButtonDown" >
        <cmd:EventToCommand Command = "{Binding MouseUpCommand}" PassEventArgsToCommand="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>
如果您不想处理前面的一次单击,您可以使用计时器等待200 ms,以查看是否有另一次单击,然后再实际处理事件,如我在此处所建议的:


看看这篇MSDN文章,它区分了点击和双击:我使用WPF而不是Windows窗体。我相信WPF应该有一些内置的或更简单的解决方案。你将事件附加到ContentControl而不是图像。为什么我被否决?@Naresh Ravlani,你投票关闭了吗?为什么?我有一个错误,这是我可以张贴和有第二双眼睛来检查问题的地方。我也尝试了这个。如果你点击的速度足够快的话,它永远不会变成“Writedouble”:它对我来说确实有效。确保当ClickCount<2时,不要做任何慢动作,因为第二次单击的录制速度不够快。我编写了一个非常简单的代码作为示例。它没有任何东西,但是绑定到命令,并且仍然不会在double处停止。你能在你的电脑上试试吗?如果我使用MouseButtonEventArgs而不是MouseEventArgs,返回的e总是空的,因为它不是if类型MouseButtonEventArgs。你应该按照我的回答处理MouseLeftButtonDown事件。它当然接受MouseButtonEvent。你真的复制了我的示例代码吗?它的工作原理与我的示例相同。不管双击,MouseUpCommand总是被调用。当然。请再次阅读我的答案:双击的第二次单击之前总是有一次单击。
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");
}