WPF中的“捕获鼠标”是什么意思?

77
System.Windows.UIElement 中,有一个 CaptureMouse() 方法和它的配对方法 ReleaseMouseCapture()。在这个WPF DragDrop 示例中,他们在 MouseDown 事件上调用 CaptureMouse 方法,在 MouseUp 事件上释放鼠标。根据MSDN文档的描述,它似乎只是简单地 "Captures the mouse"。
在我没有尝试之前,我曾认为它可以将鼠标锁定在 UIElement 范围内,但在实际尝试时,显然不是这样。经过测试,它似乎与当鼠标在 UIElement 外部时响应事件有关,但我不想成为一名盲目模仿的程序员,所以我希望能够得到权威的解释。

1
考虑如何调整(更一般地操作)在图形编辑器中绘制的元素大小。如果您想使用边界框的角来调整大小,并允许将角拖动到画布外部,则需要捕获鼠标以继续接收鼠标事件,即使鼠标指针已离开画布元素也是如此。 - mins
3个回答

85

来自MSDN上的《捕获和释放鼠标》

当一个对象捕获了鼠标,所有与鼠标相关的事件都被视为该对象执行事件,即使鼠标指针在另一个对象上。

只有拥有鼠标捕获的控件才能接收鼠标事件,直到释放为止。

捕获鼠标对于拖动非常有用,因为所有拖动代码可以存在于一个控件中,而不必分散到多个控件中。


19
捕获鼠标最重要的是仅捕获控件接收鼠标事件。 - Lukas Cenovsky
1
MSDN中没有提到这样非常重要的信息。 - user1034912

14

当控件捕获了鼠标后,即使鼠标指针不再在其边界区域内,该控件也将接收鼠标事件。

通常用于以下情况:

  • 拖放
  • 按钮(处理鼠标抬起事件,当您按下按钮并移动鼠标后释放按钮)

4
Silverlight 2文档中有更详细的描述,但我不知道为什么这部分内容没有出现在3.5文档页面上:
当一个对象捕获了鼠标时,它会接收鼠标输入,无论鼠标指针是否在其边界区域内。通常只在模拟拖动操作期间才会捕获鼠标。 WPF也是同样的原理,所以在DragDrop中使用它的原因是,在鼠标可能超出该控件的情况下,它可以向拖动控件报告信息。如果取消对MyCanvas.Capture()和Capture(Null)(用于清除)的注释,则无法进行投放。

2
从您引用的SL文档中可以看到:“鼠标通常只在模拟拖动操作期间被捕获。” - 什么是“模拟拖动操作”,它与真实操作有何不同?谢谢。 - Sabuncu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接