右键单击+左键单击被视为拖放

时间:2015-07-21 16:27:51

标签: wpf drag-and-drop

我有一个带有StackPanel的ListView作为ListView项目。 StackPanel有一个右键单击显示的上下文菜单。我可以使用拖放操作重新排列StackPanel顺序。

问题是,当我选择并右键单击StackPanel(ListViewItem)上下文菜单时,然后我点击另一个StackPanel(其他ListViewItem),DragEnter,DragOver和DragLeave事件被触发。

简单的右键和左键单击操作被解释为拖放。我尝试设置鼠标右键Up和Down事件来处理true但没有用。 如何通过真正的拖放操作来区分这种情况?

2 个答案:

答案 0 :(得分:0)

如果您还没有这样做......您可以将初始鼠标位置存储在PreviewMouseLeftButtonDown上,并使用PreviewMouseMove来确定用户是否正在执行拖放操作。这里有一些示例代码:

private static void OnPreviewMouseLeftButtonDown( object sender, MouseButtonEventArgs e )
    {
        // Store the mouse position
        m_StartPoint = e.GetPosition( null );
    }

private static void OnPreviewMouseMove( object sender, MouseEventArgs e )
    {
        Point mousePos = e.GetPosition( null );
        Vector diff = m_StartPoint - mousePos;

        if ( e.LeftButton == MouseButtonState.Pressed &&
            ( Math.Abs( diff.X ) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs( diff.Y ) > SystemParameters.MinimumVerticalDragDistance ) )
        {
            // Dragging ...
        }
    }

答案 1 :(得分:0)

我想您也可以尝试计算鼠标按下的时间。这似乎是我的iphone在我试图移动应用程序时所知道的。

我会发布代码,但事实证明这比我预期的要困难得多。显然,我无法将mouseTimer.Elapsed分配给MainWindow()方法中的事件,在MouseLeftButtonDown(s,e)方法中启动计时器,并在MouseLeftButtonUp(s,e)方法中停止计时器。关于他们使用不同线程并需要Dispatcher的东西。如果你理解线程(我没有),那么让它工作起来相当容易。目标是检查Elapsed事件发生时是否按下了鼠标左键。这意味着该人将鼠标按钮按下足够长的时间(如果它是触摸屏,则触摸该物体足够长的时间)。