2015-07-21 4 views
1

У меня есть ListView с StackPanel как элементы ListView. В StackPanel есть контекстное меню, которое отображается в правом клике. Я могу изменить порядок StackPanel, используя операцию перетаскивания.Щелкните правой кнопкой мыши + левый щелчок мышью как перетащить Drop

Проблема заключается в том, когда я выбираю и щелкаю правой кнопкой мыши по контекстному меню StackPanel (ListViewItem), затем я нажимаю на другое событие StackPanel (другой ListViewItem), DragEnter, DragOver и DragLeave.

Простая операция правого и левого кликов интерпретируется как «Перетаскивание». Я попробовал настроить правую кнопку мыши на кнопку «Вверх» и «Вниз», чтобы обработать true, но не использовать. Как я могу отличить этот сценарий от реальной операции перетаскивания?

ответ

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). Что-то о них использует разные потоки и нуждается в диспетчере. Если вы понимаете потоки (я этого не делаю), это должно быть довольно легко заставить это работать. Цель состоит в том, чтобы проверить, нажата ли левая кнопка мыши, когда произошло Истекшее событие. Это означает, что человек достаточно долго удерживал кнопку мыши (или касался вещи достаточно долго, если это сенсорный экран).

Смежные вопросы