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


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

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

3 64

3 ответа:

с захват и расцепление мыши на MSDN:

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

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

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

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

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

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

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

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