2009-06-02 5 views
62

На System.Windows.UIElement есть CaptureMouse() и в паре ReleaseMouseCapture(). В этом примере WPF DragDrop они вызывают CaptureMouse на MouseDown и выпускают его на MouseUp. documentation in MSDN примерно такой же бесполезный, как и он - «CaptureMouse -> Захват мыши».Что значит «Захват мыши» в WPF?

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

ответ

70

Из Capture and Uncapture the Mouse на MSDN:

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

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

+12

Самым важным на захвате мыши является ** только захват управления ** принимает события мыши. –

+0

Такая очень важная информация, о которой не упоминается в MSDN – user1034912

3

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

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

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

+0

Из документации SL, которую вы указали: «Мышь обычно снимается только во время имитируемых операций перетаскивания». - что такое «симулированная операция перетаскивания» и как она отличается от реальной? Благодарю. – Sabuncu

11

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

Как правило, он используется для:

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