Что означает "Захват мыши" в WPF?

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

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

Ответ 1

Из Захват и снятие мыши в MSDN:

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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