_System.Windows.UIElement
_には、CaptureMouse()
とペアのReleaseMouseCapture()
メソッドがあります。この WPF DragDrop サンプルでは、MouseDownでCaptureMouseを呼び出し、MouseUpで解放します。 MSDNのドキュメント は、「CaptureMouse-> Captures the mouse」という意味で役に立たないものです。
試してみる前に頭の中で、どういうわけかマウスをUIElementの境界内にロックしたと思いましたが、試してみると明らかにそうではありません。実験から、マウスがUIElementの外にあるときにイベントに応答することに関係しているように見えますが、 カーゴカルトプログラマー にはなりたくないので、ただ使用したくありません。例は、私がそれが何を意味するかについての権威ある説明が欲しいです。
マウスのキャプチャとアンキャプチャ MSDNから:
オブジェクトがマウスをキャプチャすると、マウスポインターが別のオブジェクト上にある場合でも、マウス関連のイベントはすべて、マウスキャプチャのあるオブジェクトがイベントを実行するかのように扱われます。
マウスをキャプチャすることはドラッグするのに便利です。キャプチャするコントロールのみがリリースされるまでマウスイベントを受け取るからです。ドラッグするコードはすべて、複数のコントロールに分散するのではなく、1つのコントロールに存在できます。
マウスをキャプチャすると、マウスポインターが境界領域内にない場合でも、コントロールはマウスイベントを受け取ります。
通常、次の用途に使用されます。
Silverlight 2のドキュメント には、より詳細な説明がありますが、3.5のドキュメントページに含まれていない理由はわかりません。
オブジェクトがマウスをキャプチャすると、そのオブジェクトは、マウスポインターが境界領域内にあるかどうかに関係なく、マウス入力を受け取ります。マウスは通常、シミュレートされたドラッグ操作中にのみキャプチャされます。
...
WPFでも同じように機能するため、DragDropで使用される理由は、マウスがそのコントロールの外にあるときに、ドラッグされているコントロールに報告する方法を知るためです。 MyCanvas.Capture()およびCapture(Null)(これをクリアする)をコメントアウトすると、ドロップできなくなります。