解决WinForm 程序中由于拖拽导致MouseUp事件无法触发的问题
2010-03-13 09:26
1751 查看
在工作过程中遇到如下问题:
在一个界面上要求控件(LinkLabel)能够拖拽,单击控件要能够跳出窗口。于是按照常规的方法,MouseDown中加入DoDragUp,再加入DragEnter和DragDrop,完事。
发现无法跳出窗口了(跳出窗口写在MouseUp事件中)。
琢磨了很久,也上网找了许多资料,包括MSDN上面的,最后重写控件解决,现总结一下:
一开始想到用双击来代替单击,无奈双击包括单击,就想能不能把他们分开呢?
MSDN上的方法有两个,一个是回滚单击操作,一个是在MouseDown 事件中区分单击和双击
链接:http://msdn.microsoft.com/zh-cn/library/ms171543.aspx,大家可以先参考一下
先说第一种:
关键的在这里:
代码
1 protected override void OnMouseDown(MouseEventArgs e)
2 {
3 if (e.Button == MouseButtons.Left)
4 {
5 this.IfDoDrag = true;//标志位,需自定义
6 }
7 base.OnMouseDown(e);
8 }
9 protected override void OnMouseMove(MouseEventArgs e)
10 {
11 if (this.IfDoDrag)//还可以加入其它的判断条件,比如拖出多少范围后才触发拖动
12 {
13 this.DoDragDrop(data, DragDropEffects.Move);
14 this.IfDoDrag = false;
15 }
16 base.OnMouseMove(e);
17 }
18 protected override void OnMouseUp(MouseEventArgs e)
19 {
20 this.doDragDrop = false;
24 base.OnMouseUp(e);
25 }
以上是我重写的LinkLabel控件,也可以依样画葫芦重写其它的控件
然后在容器中添加该控件,就像使用普通的LinkLabel一样,添加MouseDown,MouseUp事件,其中MouseDown中需要将需要拖拽的数据data传入控件,而MouseUp中就可以执行先前需要单击执行的操作。
这样,问题就解决了。
在一个界面上要求控件(LinkLabel)能够拖拽,单击控件要能够跳出窗口。于是按照常规的方法,MouseDown中加入DoDragUp,再加入DragEnter和DragDrop,完事。
发现无法跳出窗口了(跳出窗口写在MouseUp事件中)。
琢磨了很久,也上网找了许多资料,包括MSDN上面的,最后重写控件解决,现总结一下:
一开始想到用双击来代替单击,无奈双击包括单击,就想能不能把他们分开呢?
MSDN上的方法有两个,一个是回滚单击操作,一个是在MouseDown 事件中区分单击和双击
链接:http://msdn.microsoft.com/zh-cn/library/ms171543.aspx,大家可以先参考一下
先说第一种:
关键的在这里:
代码
1 protected override void OnMouseDown(MouseEventArgs e)
2 {
3 if (e.Button == MouseButtons.Left)
4 {
5 this.IfDoDrag = true;//标志位,需自定义
6 }
7 base.OnMouseDown(e);
8 }
9 protected override void OnMouseMove(MouseEventArgs e)
10 {
11 if (this.IfDoDrag)//还可以加入其它的判断条件,比如拖出多少范围后才触发拖动
12 {
13 this.DoDragDrop(data, DragDropEffects.Move);
14 this.IfDoDrag = false;
15 }
16 base.OnMouseMove(e);
17 }
18 protected override void OnMouseUp(MouseEventArgs e)
19 {
20 this.doDragDrop = false;
24 base.OnMouseUp(e);
25 }
以上是我重写的LinkLabel控件,也可以依样画葫芦重写其它的控件
然后在容器中添加该控件,就像使用普通的LinkLabel一样,添加MouseDown,MouseUp事件,其中MouseDown中需要将需要拖拽的数据data传入控件,而MouseUp中就可以执行先前需要单击执行的操作。
这样,问题就解决了。
相关文章推荐
- 解决Android按住空白区域,导致点击其他按钮无法触发点击事件的问题
- IIS中预览错误问题的解决办法(HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射 )
- 解决jquery中动态新增的元素节点无法触发事件问题的两种方法
- Ajax局部更新导致JS事件重复触发问题的解决方法
- selenium中用fireEvent解决select和type无法触发onXXX事件的问题
- 中文输入法导致html input的onkeyup事件无法被触发,解决方法
- 问题解决:listview 的itemclick事件无法触发
- SqlServer2005 provider: TCP 提供程序, error: 0 - 由于目标计算机积极拒绝,无法连接。) (Microsoft SQL Server,错误: 10061)问题解决
- 关于UseSubmitBehavior和OnClientClick同时使用,导致无法触发后台事件的问题
- 由于计算机磁盘硬件配置出现问题,导致 Windows 无法启动的解决方法 由于计算机磁盘硬件配置出现问题,导致 Windows 无法启动
- SilverLight学习笔记--如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题
- 连接无法释放导致的程序问题解决
- 如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题
- 解决端口被占用而导致软件运行失败,程序无法启动,无法安装开发工具等问题
- 解决由于使用代理服务器导致Foxmail无法收发邮件的问题
- $.hover()事件 快速触发导致动作延迟问题的解决
- TActiveForm遇到的焦点问题,导致Key/MouseWheel事件无法接收
- 解决js中文输入法无法触发onkeyup事件问题(转)
- 如何解决由于服务过多或异常导致ArcGIS Server 无法正常运行的问题
- Ubuntu由于修改etc/profile文件导致开机无法登陆问题解决办法(仅供参考)