右键+左键被视为拖放。

3

我有一个ListView,其中的ListView Items是StackPanel。 StackPanel具有在右键单击时显示的上下文菜单。 我可以使用拖放操作重新排列StackPanel顺序。

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

简单的右键和左键单击操作被解释为拖放操作。 我尝试将鼠标右键Up和Down事件设置为已处理但没有用。如何区分此场景与实际的拖放操作?

2个回答

0

我认为你也可以尝试计算鼠标按下的时间。这似乎是我的 iPhone 知道我何时在移动应用程序的方式。

我想发布代码,但这比我预期的要困难得多。显然,我不能将 mouseTimer.Elapsed 分配给 MainWindow() 方法中的事件,在 MouseLeftButtonDown(s, e) 方法中启动计时器,并在 MouseLeftButtonUp(s, e) 方法中停止计时器。这涉及到它们使用不同的线程并需要 Dispatcher。如果您了解线程(我不了解),那么应该很容易使其正常工作。目标是检查当 Elapsed 事件发生时是否按下了左键。这意味着人们按住鼠标按钮足够长时间(或者如果是触摸屏,则触摸时间足够长)。


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 ...
        }
    }

我已经在做这个了。我的右键打开上下文菜单,左键开始拖放操作。 - lerner1225

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接