在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件。
例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开。
在这个过程中,控件1只会触发MouseDown事件,而控件2则只会触发MouseUp事件,鼠标不在控件上他们就收不到对应的鼠标事件。
同样的如果某个控件注册了MouseMove事件,当鼠标移动到控件外之后,控件将不会接收到MouseMove事件。
但是在很多情况下我们需要在鼠标移动到控件外之后还能接收鼠标事件。例如按住鼠标拖动,当鼠标到了控件外,拖动操作依然可以继续。
这些情况需要控件强制捕获鼠标,这就要用到UIElment 的CaptureMouse 函数和ReleaseMouseCapture 函数。
CaptureMouse 函数的作用是尝试将鼠标强制捕获到控件,ReleaseMouseCapture 函数的作用是当控件具有鼠标捕获的话,则释放该捕获。

下面举个例子,例如我们需要在一张图片上通过鼠标拖动画一个矩形框,操作步骤分为:
1. 点击鼠标左键,确定矩形的一个顶点P;
2. 按住鼠标左键并拖动鼠标,将鼠标位置作为矩形中顶点P所属的对角线的另外一个顶点,画矩形;
3. 放开鼠标左键,完成矩形绘制。
但是当鼠标移动到图片边缘的时候,图片接收不到鼠标MouseMove和MouseUP事件,绘制过程就无法正常完成了。

为了解决这个问题,我们需要在MouseLeftButtonDown 事件的相应函数中加上如下代码
((UIElement)e.Source).CaptureMouse();
在MouseUp 事件的相应函数中加入
((UIElement)e.Source).ReleaseMouseCapture();
这样,即使鼠标在图片外,我们也能继续执行捕获的鼠标事件。

为了让矩形不画到图片外,我们可以对矩形的边框位置加上限制,矩形的两个顶点必须限制:
    Point p = e.GetPosition(this.imageControl);
    p.X = Math.Max(0, p.X);
    p.Y = Math.Max(0, p.Y);
    p.X = Math.Min(this.imageControl.Width, p.X);
    p.Y = Math.Min(this.imageControl.Height, p.Y);
在使用了CaptureMouse 函数将鼠标强制捕获到控件后,一定不要忘记在完成操作后使用ReleaseMouseCapture 函数释放捕获,

否则在其他控件上进行鼠标操作依然会触发捕获鼠标的控件的鼠标事件,而非原本鼠标点击的控件的鼠标事件响应函数。

转载于:https://www.cnblogs.com/qiantao/p/9429831.html

WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件相关推荐

  1. WPF:鼠标拖曳、拖动控件

    效果 布局 <Grid Grid.Row="0" Name="gridChart" Margin="50,20" SizeChange ...

  2. 【转】WPF从我炫系统5---基本控件的用法

    今天我来给大家讲解WPF中一些基本控件的用法,所谓基本控件,就是我们最常用用到的一些控件,通过这一节的讲解,大家会对WPF中的控件的用法有一个更深入的了解. 1.       基本控件 LABEL控件 ...

  3. 【Qt教程】3.1 - Qt5 event事件、Label控件的鼠标事件捕获

    1. event简介 事件(event)是由系统或者Qt本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键 ...

  4. Qt安装事件过滤器、过滤子控件事件、截获控件按键、鼠标事件

    Qt安装事件过滤器.过滤子控件事件.截获控件按键.鼠标事件 Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理. 假设我们有一个C ...

  5. Python机器视觉--OpenCV入门--鼠标事件与TrackBar控件(含小项目:OpenCV调色板)

    1.鼠标事件与TrackBar控件 1.1控制鼠标 OpenCV允许我们对窗口上的鼠标动作做出响应. setMouseCallback(winname, callback, userdata) win ...

  6. WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探

    原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感觉WPF的开发思 ...

  7. jquery实现上下左右键盘监听_基于 jQuery 实现键盘事件监听控件

    最近项目里要做一个画板,需要对键盘事件进行监听,来进行诸如撤回.重做.移动.缩放等操作,因此顺手实现了一个键盘事件监听控件,期间略有收获,整理出来,希望对大家有所帮助,更希望能获得高手的指点. 1. ...

  8. 【转】WPF从我炫系列3---内容控件的用法

    今天我来给大家讲解WPF中内容控件的用法,在WPF中的内容控件,通俗的讲,是指具有Content属性的控件,在content属性里面可以嵌套放置任意其他类型的控件,但是Content只能接受单个元素, ...

  9. WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性

    原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...

最新文章

  1. 如何利用离散Hopfield神经网络进行高校科研能力评价(1)
  2. 《深入理解Nginx:模块开发与架构解析》一1.2 为什么选择Nginx
  3. crc错误 modbus poll_Modbus通讯错误检测方法
  4. 安装centos系统时,修改默认网卡名
  5. java中super关键字_java中super关键字有什么用法
  6. 小白开学Asp.Net Core 《七》
  7. 群联固态硬盘修复工具_固态硬盘掉速修复小教程,SATA和NVMe协议通用
  8. 群晖NAS删除文件不释放空间的原因和方法
  9. PyTorch 深度学习:32分钟快速入门——DenseNet
  10. Landsat8的不同波段组合说明
  11. 字体引起的用户密码错误
  12. 【北通游戏手柄安装驱动(WIN10)】
  13. 谈谈自己对移动互联网的看法
  14. 芯科技之AD7705介绍
  15. 超详细——python把中文汉字转成拼音xpinyin,pypinyin,snownlp三种方法
  16. linux 重启apache:apachectl -k graceful
  17. SimCSE 对比学习方法
  18. 大数据分析过程是如何的
  19. 【阅读笔记】联邦学习实战——联邦学习智能用工案例
  20. scratch连接wedo2.0超详细教程(附资源)

热门文章

  1. linux 字符串加入中括号,Shell 中的中括号用法总结
  2. arraylist 线程安全_数据结构之Array、ArrayList、List、LinkedList对比分析
  3. X-Frame-Options防止自己的网页放被在别人iframe中
  4. Springboot注册Filter
  5. JavaScript数据结构与算法——队列详解(上)
  6. boost::mutex::scoped_lock
  7. Linux基础命令---fold
  8. SylixOS异常管理
  9. java 杀掉 linux下进程和进程的子孙进程
  10. HTML5事件——contextmenu 隐藏鼠标右键菜单