2015-07-21 108 views
1

我有一個ListView與StackPanel作爲ListView項目。 StackPanel有一個右鍵單擊顯示的上下文菜單。我可以使用拖放操作重新排列StackPanel順序。右鍵單擊+左鍵單擊被認爲是拖放刪除

的問題是,當我選擇,並顯示一個StackPanel(ListViewItem的)上下文菜單上單擊鼠標右鍵,然後我點擊另一個StackPanel中(其他ListViewItem的),也越來越引發的dragenter,和的dragover事件DragLeave。

簡單的右鍵和左鍵單擊操作被解釋爲拖放。我嘗試設置鼠標右鍵向上和向下事件處理正確,但沒有用。 如何區分這種情況與真正的拖放操作?

回答

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

我已經這麼做了。我的右鍵單擊打開一個上下文菜單,我的左鍵單擊開始拖放操作。 – lerner1225

0

我想你也可以嘗試定時多久鼠標被按下。這似乎是我的iPhone在嘗試移動應用程序時知道的。

我會後的代碼,但是這竟然是比我預想的要困難得多。顯然,我不能將MouseTimer.Elapsed分配給MainWindow()方法中的事件,在MouseLeftButtonDown(s,e)方法中啓動計時器,並在MouseLeftButtonUp(s,e)方法中停止計時器。有關他們使用不同的線程,需要一個分派器。如果你瞭解線程(我不知道),那麼讓它工作起來應該相當容易。目標是檢查Elapsed事件發生時是否按下鼠標左鍵。這意味着該人將鼠標按鈕按下足夠長的時間(或者如果它是觸摸屏,觸摸該事物的時間足夠長)。