在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 函数释放捕获,

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

WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件的更多相关文章

  1. WinForm 鼠标进入移开窗体事件,因子控件导致的误触发

    /// <summary> /// 重写OnControlAdded方法,为每个子控件添加MouseLeave事件 /// </summary> /// <param n ...

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

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

  3. 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

    原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...

  4. delphi中响应鼠标进入或离开控件的方法

    Delphi没有MouseEnter与MouseLeave的事件,网上说可以响应CM_MOUSEENTER和CM_MOUSELEAVE消息来实现.这两个消息是VCL自己定义的消息,看了Delphi的C ...

  5. 关于C#界面开发winform与SharpGL结合鼠标只在OpenGLControl绘图区域显示坐标移动消息响应(鼠标单独在某个控件上的消息响应)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11773260.html 因为很多时候我们开发画图之类的工具时,鼠标移动之类的,都只想在绘图区域 ...

  6. 《Programming WPF》翻译 第5章 7.控件模板

    原文:<Programming WPF>翻译 第5章 7.控件模板 如果仔细的看我们当前的TTT游戏,会发现Button对象并没有完全为我们工作.哪些TTT面板有内圆角? 图5-14 这里 ...

  7. 【WPF学习】第六十章 创建控件模板

    经过数十天的忙碌,今天终于有时间写博客. 前面一章通过介绍有关模板工作方式相关的内容,同时介绍了FrameWorkElement下所有控件的模板.接下来将介绍如何构建一个简单的自定义按钮,并在该过程中 ...

  8. WPF中嵌入WinForm中的webbrowser控件

    原文:WPF中嵌入WinForm中的webbrowser控件 使用VS2008创建WPF应用程序,需使用webbrowser.从工具箱中添加WPF组件中的webbrowser发现其中有很多属性事件不能 ...

  9. WPF自定义控件(二)の重写原生控件样式模板

    话外篇: 要写一个圆形控件,用Clip,重写模板,去除样式引用圆形图片可以有这三种方式. 开发过程中,我们有时候用WPF原生的控件就能实现自己的需求,但是样式.风格并不能满足我们的需求,那么我们该怎么 ...

随机推荐

  1. js操作bom和dom

    Bom 概念 BOM : Browser Object Model 浏览器对象模型,描述与浏览器进行交互的方法和接 口, ECMAscript是javascript的核心,但如果要在web中使用jav ...

  2. javascript中的replace方法

    1.replace 调用方法str.replace(regexp|substr, newSubStr|function) regexp,正则表达式 substr,需要被替换的字符串 newSubStr ...

  3. shiro授权测试

    shiro-permission.ini 创建存放权限的配置文件shiro-permission.ini,如下: [users] #用户zhang的密码是1111111,此用户具有role1和role ...

  4. git常用的命令行

    git管理相关基础命令行,因为现在很多公司都用git管理代码,所以被问及的概率很大,可以用pycharm的git系统,也可以用git代码管理 $git init #初始化仓库$git branch 分 ...

  5. Windows 10 IoT Core 17115 for Insider 版本更新

    今天,微软发布了Windows 10 IoT Core 17115 for Insider 版本更新,本次更新只修正了一些Bug,没有发布新的特性. 一些已知的问题如下: F5 driver depl ...

  6. 使用Sybmol模块来构建神经网络

    符号编程 在之前的文章,我们介绍了NDArray模块,它是MXNet中处理数据的核心模块,我们可以使用NDArray完成非常丰富的数学运算.实际上,我们完全可以使用NDArray来定义神经网络,这种方 ...

  7. 吴恩达机器学习笔记41-支持向量机的优化目标(Optimization Objective of Support Vector Machines)

  8. C#不同窗体间数据传递

    在做项目中经常会使用不同窗体之间的值,所以就有了传值的概念.最常见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道. 1.       如果很多窗体都需要用到某一窗体的东西,比如登录窗体记 ...

  9. 网页的异步请求(Ajax)

    JS原生Ajax操作(XMLHttpRequest) GET请求 var xmld=new XMLHttpRequest(); xmld.open("GET","wan. ...

  10. React Native IOS搭建开发环境

    安装 必须的软件 Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/mast ...