在WPF中“捕获鼠标”意味着什么?

System.Windows.UIElement有一个CaptureMouse()和一个配对的ReleaseMouseCapture()方法。 在这个WPF DragDrop示例中,他们在MouseDown上调用CaptureMouse并在MouseUp上释放它。 MSDN中的文档大概是毫无用处的 – “CaptureMouse – >捕获鼠标”。

在我尝试之前,我认为它在某种程度上将鼠标locking在UIElement界限内,但是当我尝试时,情况显然不是这样。 从实验来看,这似乎与鼠标在UIElement之外的事件响应有关,但不想成为货物崇拜的程序员,我不想仅仅因为这个例子而使用它,我想它是什么意思的权威描述。

从MSDN 捕获和取消捕获鼠标 :

当对象捕获鼠标时,即使鼠标指针位于另一个对象上,所有与鼠标有关的事件也会被视为鼠标捕获的对象执行事件。

捕获鼠标对于拖动非常有用,因为只有捕获控件才会收到鼠标事件,直到释放。 所有的拖动代码都可以存在于一个控件中,而不是分散在多个控件中。

当捕获鼠标时,即使鼠标指针不在其边界区域内,控件也会收到鼠标事件。

通常,它用于:

  • 拖放
  • button(将鼠标放在button上并在释放button之前移动鼠标来处理鼠标向上)

Silverlight 2的文档有更详细的描述,我不知道为什么它不是3.5文档页面的一部分:

当一个对象捕获鼠标时,不pipe鼠标指针是否在其边界区域内,该对象都会接收鼠标input。 通常只在模拟的拖动操作中捕获鼠标。

它与WPF的工作原理是一样的,所以它与DragDrop一起使用的原因是,它知道如何向鼠标可能在该控件之外的情况下从鼠标拖回的控件报告。 如果你注释掉MyCanvas.Capture()和Capture(Null)(清除它),那么你不能再下降。