博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wpf鼠标捕获与控件交互——UIElement.CaptureMouse
阅读量:4456 次
发布时间:2019-06-08

本文共 2379 字,大约阅读时间需要 7 分钟。

本例实现了一个鼠标控制控件移动的简单例子,配合鼠标捕获达成预想效果:


1.新建一个wpf应用程序,为了演示效果,xaml简单修改如下:

共有三个圆(蓝、绿、黄),下面将要实现如何用鼠标拖动他们移动


2.后台cs如下:

///     /// MainWindow.xaml 的交互逻辑    ///     public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();        }        Point pBefore = new Point();//鼠标点击前坐标        Point eBefore = new Point();//圆移动前坐标        bool isMove = false;//是否需要移动        //Root 鼠标左键按下事件        private void LayoutRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)        {            if (e.OriginalSource.GetType() == typeof(Ellipse))            {                this.pBefore = e.GetPosition(null);//获取点击前鼠标坐标                Ellipse el = (Ellipse)e.OriginalSource;                this.eBefore = new Point(Canvas.GetLeft(el), Canvas.GetTop(el));//获取点击前圆的坐标                isMove = true;//开始移动了                el.CaptureMouse();//鼠标捕获此圆            }        }        //Root 鼠标左键放开事件        private void LayoutRoot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)        {            if (e.OriginalSource.GetType() == typeof(Ellipse))            {                Ellipse el = (Ellipse)e.OriginalSource;                isMove = false;//结束移动了                el.ReleaseMouseCapture();//鼠标释放此圆            }        }        //Root 鼠标移动事件        private void LayoutRoot_MouseMove(object sender, MouseEventArgs e)        {            if (e.OriginalSource != null && e.OriginalSource.GetType() == typeof(Ellipse) && isMove)            {                Ellipse el = (Ellipse)e.OriginalSource;                Point p = e.GetPosition(null);//获取鼠标移动中的坐标                Canvas.SetLeft(el, eBefore.X + (p.X - pBefore.X));                Canvas.SetTop(el, eBefore.Y + (p.Y - pBefore.Y));            }        }    }

因为不知道鼠标将会点击圆的哪一个部位,所以需要计算鼠标坐标pBefore,设置圆的坐标eBefore;

这里在鼠标左键按下点击圆的时候,设置了CaptureMouse,在鼠标松开左键时,设置ReleaseMouseCapture,试着注释掉这两行,观察程序运行的不同效果:

(1).移动其中一个圆,当碰到其他圆的时候:

设置了鼠标捕获的,移动中的圆将穿过其他圆而不造成影响;

没有设置鼠标捕获的,移动中的圆,碰到其他圆的时候,将会发生跳跃,变成移动其他的圆;

(2).移动圆至窗口边缘,甚至是窗口之外:

设置了鼠标捕获的,圆可以被移动到窗口之外;

没有设置鼠标捕获的,圆将被束缚在窗口之内;

可以试着只保留CaptureMouse,而注释掉ReleaseMouseCapture,鼠标在捕获圆之后将无法释放,你甚至将无法点击窗口左上角的关闭按钮;

鼠标捕获与释放CaptureMouse与ReleaseMouseCapture,在一些鼠标与控件的交互处理上将会体现出很大的作用,因为在你捕获一个控件时,鼠标将无法再操作到其他控件,同时也不会受其他控件的影响

转载于:https://www.cnblogs.com/xwlyun/archive/2012/09/12/2681585.html

你可能感兴趣的文章
bootstrapValidator 插件
查看>>
【CodeForces】191C Fools and Roads
查看>>
enum hack
查看>>
2017.2.7 开涛shiro教程-第六章-Realm及相关对象(三)
查看>>
Visual Studio 2008切换到设计视图卡死解决办法-Troubleshooting "Visual Studio 2008 Design view hangs" issues...
查看>>
数据库设计范式
查看>>
sql2005-数据库备份方案 (转载)
查看>>
centos中安装jdk的操作
查看>>
此实现不是Win平台FIPS验证的加密算法的一部分
查看>>
MongoDB的模糊查询操作(类关系型数据库的 like 和 not like)
查看>>
Django使用cors解决跨域问题
查看>>
使用UnityVS1.8.2搭配VS2013进行Unity3D代码调试(下载+安装+使用+问题解决)
查看>>
jQuery Ajax 实例 ($.ajax、$.post、$.get)
查看>>
mssql sqlserver 获取指定日期为本月第几个工作日
查看>>
web 服务器负载均衡
查看>>
ansible最佳实战部署nginx
查看>>
SharedPreferences
查看>>
Luogu P2482 [SDOI2010]猪国杀
查看>>
python with as的用法
查看>>
数据结构---列表与数组
查看>>