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


74

System.Windows.UIElementCaptureMouse()和配对的ReleaseMouseCapture()方法。在此WPF DragDrop示例中,他们在MouseDown上调用CaptureMouse并在MouseUp上释放它。MSDN中文档几乎毫无用处-“ CaptureMouse->捕获鼠标”。

在尝试之前,我曾以为它以某种方式将鼠标锁定在UIElement边界内,但我尝试时显然不是这种情况。从实验来看,当鼠标位于UIElement之外时,似乎与响应事件有关,但又不想成为一个狂热的程序员,我不想只使用它,因为示例确实如此,我想有关其含义的权威描述。


考虑如何调整在图形编辑器中绘制的元素的大小(更一般而言,对其进行操作)。如果要使用边界框的角调整大小,并允许将角拖动到画布外,则需要捕获鼠标以在鼠标指针离开画布元素时继续接收鼠标事件。
分钟

Answers:


82

从在MSDN上捕获和捕获鼠标

当对象捕获鼠标时,所有与鼠标相关的事件都将被视为具有鼠标捕获的对象执行该事件,即使鼠标指针悬停在另一个对象上也是如此。

只有捕获控件会收到鼠标事件,直到释放为止。

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


16
在捕获鼠标上最重要的是仅捕获控件会接收鼠标事件。
卢卡斯·塞诺夫斯基

1
这样的非常重要的信息没有在MSDN中提及
user1034912 '17

13

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

通常,它用于:

  • 拖放
  • 按钮(当您将鼠标放在按钮上并在释放按钮之前移动鼠标时可以处理“鼠标向上”)

4

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

当一个对象捕获了鼠标时,无论鼠标指针是否在其边界区域内,该对象都会接收鼠标输入。通常仅在模拟拖动操作期间捕获鼠标。
...

它与WPF相同,因此与DragDrop一起使用的原因是,当鼠标可能不在控件之外时,它知道如何向被拖动的控件报告。如果您注释掉MyCanvas.Capture()和Capture(Null)(将其清除),则您将无法再删除它。


1
在SL文档中,您引用了“通常只在模拟拖动操作期间捕获鼠标”。-什么是“模拟拖动操作”,它与实际操作有何不同?谢谢。
Sabuncu 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.