Что значит «Захватить мышь» в WPF? - PullRequest
66 голосов
/ 03 июня 2009

На System.Windows.UIElement есть CaptureMouse() и парный ReleaseMouseCapture() метод. В этом WPF DragDrop примере они вызывают CaptureMouse для MouseDown и выпускают его для MouseUp. Документация в MSDN практически бесполезна - "CaptureMouse -> Захватывает мышь".

В голове перед попыткой я предположил, что она каким-то образом заблокировала мышь внутри границ UIElement, но это явно не тот случай, когда я пытаюсь это сделать. Из экспериментов кажется, что это как-то связано с реагированием на события, когда мышь находится за пределами UIElement, но не хочет быть программистом культа грузов Я не хочу просто использовать это, потому что да, я хотел бы авторитетное описание того, что это значит.

Ответы [ 3 ]

74 голосов
/ 03 июня 2009

С Захват и отмена захвата мыши на MSDN:

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

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

11 голосов
/ 03 июня 2009

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

Обычно используется для:

  • Перетащите
  • Кнопки (для работы с Mouse Up, когда вы нажимаете кнопку мыши и перемещаете мышь, прежде чем отпустить кнопку)
4 голосов
/ 03 июня 2009

Документация Silverlight 2 для него имеет более подробное описание, я не знаю, почему она также не является частью страницы документации 3.5:

Когда объект захватил мышь, этот объект получает ввод мыши независимо от того, находится ли указатель мыши в пределах его ограничивающей области. Мышь обычно захватывается только во время симулированных операций перетаскивания.
...

Он работает так же с WPF, и поэтому причина его использования с DragDrop заключается в том, что он знает, что должен отчитываться перед перетаскиваемым элементом управления, когда мышь может находиться вне этого элемента управления. Если вы закомментируете MyCanvas.Capture () и Capture (Null) (который очищает его), вы больше не сможете удалить.

...