MouseEnter / MouseLeave и левая кнопка мыши вниз - PullRequest
1 голос
/ 28 января 2011

Я пытаюсь реализовать выделение с помощью щелчка и перетаскивания, как в проводнике Windows (синий прямоугольник выделения, который появляется, когда вы удерживаете кнопку мыши нажатой и перемещаете мышь).

Так что в основном яиметь ListView, со стилизованным и шаблонным ListViewItem.Я добавил события MouseEnter и MouseLeave в свой ListViewItem (с EventSetter), он работает нормально, за исключением случаев, когда левая кнопка мыши нажата.В этом случае события не запускаются, что не очень хорошо для того, чего я пытаюсь достичь.

Знаете ли вы, есть ли хороший обходной путь для этого, я хочу знать, когда я 'м над элементом или нет, когда левая кнопка мыши нажата.

Пока я пытался с VisualTreeHelper.HitTest (), но я знаю только, когда я пересекаю ListViewItem, и мне нужно знать, когдаЯ оставляю это.

Спасибо.

Ответы [ 3 ]

1 голос
/ 29 января 2011

Вы должны захватить мышь UIElement.CaptureMouse при нажатии кнопки, а затем отпустить мышь UIElement.ReleaseMouseCapture во время события MouseUp. Вам не нужно беспокоиться о каких-либо других событиях, потому что весь ввод мыши передается на ваш UIElement во время захвата.

Эта форма выбора называется "лассо", и большинство виджетов в приложениях Windows поддерживают ее. Фактически, сам ListView уже делает.

0 голосов
/ 29 января 2011

Итак, я нашел другое решение для управления этим поведением.

Я начал с этим ответом stackoverflow Щелкните и перетащите поле выбора в WPF

InmouseMove, после изменения размера selectionBox, я выбираю элементы, которые находятся в области selectionBox.

Я делаю это так:

 //Select all visible items in select region.
 Rect selectRect = new Rect(Canvas.GetLeft(selectionBox), Canvas.GetTop(selectionBox),
                (Canvas.GetLeft(selectionBox) + selectionBox.Width), (Canvas.GetTop(selectionBox) + selectionBox.Height));

 RectangleGeometry rr = new RectangleGeometry(selectRect);
 foreach (CustomElement elt in mainList.Items)
 {
  ListViewItem item = mainList.ItemContainerGenerator.ContainerFromItem(elt) as ListViewItem;
  Rect r = LayoutInformation.GetLayoutSlot(item);
  if (r.IntersectsWith(selectRect))
        item.IsSelected = true;
  else
        item.IsSelected = false;
 }

Я обнаружил, что LayoutInformation может дать вамRect, представляющий ваш объект, поэтому я могу проверить, пересекается ли он с selectionBox Rect.

0 голосов
/ 28 января 2011

Даже если ваши события MouseEnter и Leave были запущены, что не обеспечило бы хороший метод для выбора, потому что оба события не имеют значения в конце: не имеет значения, касалась ли ваша мышь когда-либо этой папки или файла, все, что имеет значение, это еслинаходится в прямоугольнике в тот момент, когда вы отпустите кнопку.Это означает, что Mouse Up & Down должно быть достаточно.В зависимости от вашего списка вы можете даже определить, какие элементы следует выбирать, просто взглянув на два элемента, на которых произошли эти события (например, если это просто одномерный список, а не двумерная сетка).

Если у вас есть сетка, вам понадобится более сложная механика, такая как отслеживание того, какая область покрыта, и проверка того, какие предметы находятся внутри или на краю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...