我有一个带有StackPanel的ListView作为ListView项目。 StackPanel有一个右键单击显示的上下文菜单。我可以使用拖放操作重新排列StackPanel顺序。
问题是,当我选择并右键单击StackPanel(ListViewItem)上下文菜单时,然后我点击另一个StackPanel(其他ListViewItem),DragEnter,DragOver和DragLeave事件被触发。
简单的右键和左键单击操作被解释为拖放。我尝试设置鼠标右键Up和Down事件来处理true但没有用。 如何通过真正的拖放操作来区分这种情况?
答案 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事件发生时是否按下了鼠标左键。这意味着该人将鼠标按钮按下足够长的时间(如果它是触摸屏,则触摸该物体足够长的时间)。