在Button的子类中重写了OnMouseMove方法,代码如下:
public class MyButton : Button { protected override void OnMouseMove(MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { MessageBox.Show("mouseMoving"); } } //protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) //{ } }
在此按钮上按住鼠标左键移动时, MessageBox.Show("mouseMoving")会执行两次,
如果把重写的OnMouseLeftButtonDown方法(空方法,什么都不做)的注释取消,MessageBox.Show("mouseMoving")就只执行一次,这是什么原因?
在OnMouseMove函数最后添加一句: e.Handled = true; 试试。
试过了,不行
@seewold: 你的需求是什么样的?
@JRoger:
其实我是想实现一个拖放功能,在panel1中放置一些button,然后拖动不同的button到另一个panel2,在panel2动态添加控件,结果发现每拖放一次会自动添加两个控件,跟踪后发现OnMouseMove执行两次(在重写button的OnMouseMove方法中调用Dragdrop.DoDragdrop方法启动拖放操作)
@seewold: 拖放的话你可以参考:http://msdn.microsoft.com/zh-cn/library/hh144799(v=vs.110).aspx
@JRoger:
我就是看了这个之后再模仿着做的。
@seewold: e.Handled在你另外的方法里面有体现吗?得用它终结路由。
@JRoger:
加了e.Handled也没用。
貌似单击Button会同时触发两次MouseMove事件。我现在只能用其他方法来处理了:
Point? dragStartPoint = null; protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { base.OnMouseLeftButtonDown(e); dragStartPoint = e.GetPosition(this); } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (e.LeftButton == MouseButtonState.Pressed && dragStartPoint != null) { Point nowPoint = e.GetPosition(this); if (Math.Abs(nowPoint.X - dragStartPoint.Value.X) > 5 || Math.Abs(nowPoint.Y - dragStartPoint.Value.Y) > 5) { dragStartPoint = null; //这一句必须写在 DragDrop.DoDragDrop之前,否则 DragDrop.DoDragDrop会执行两次 DragDrop.DoDragDrop(this, “test”, DragDropEffects.Copy); } } }
这样就不会执行两次。
这样就不会执行两次