【问题标题】:Right click + Left click is considered as Drag Drop右键单击+左键单击被视为拖放
【发布时间】:2015-10-11 05:41:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf drag-and-drop


    【解决方案1】:

    如果您还没有这样做...您可以将初始鼠标位置存储在 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 ...
            }
        }
    

    【讨论】:

    • 我已经这样做了。我的右键单击打开一个上下文菜单,我的左键单击开始拖放操作。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 2019-04-12
      • 2012-01-14
      相关资源
      最近更新 更多