首页 新闻 赞助 找找看

重写WPF中 Button.OnMouseMove方法的问题

1
悬赏园豆:5 [待解决问题]

在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")就只执行一次,这是什么原因?

seewold的主页 seewold | 初学一级 | 园豆:109
提问于:2014-02-20 17:36
< >
分享
所有回答(2)
0

在OnMouseMove函数最后添加一句: e.Handled = true;  试试。

JRoger | 园豆:258 (菜鸟二级) | 2014-02-20 17:41

试过了,不行

支持(0) 反对(0) seewold | 园豆:109 (初学一级) | 2014-02-20 20:43

@seewold: 你的需求是什么样的?

支持(0) 反对(0) JRoger | 园豆:258 (菜鸟二级) | 2014-02-21 09:25

@JRoger: 

其实我是想实现一个拖放功能,在panel1中放置一些button,然后拖动不同的button到另一个panel2,在panel2动态添加控件,结果发现每拖放一次会自动添加两个控件,跟踪后发现OnMouseMove执行两次(在重写button的OnMouseMove方法中调用Dragdrop.DoDragdrop方法启动拖放操作)

支持(0) 反对(0) seewold | 园豆:109 (初学一级) | 2014-02-21 12:31

@seewold: 拖放的话你可以参考:http://msdn.microsoft.com/zh-cn/library/hh144799(v=vs.110).aspx

支持(0) 反对(0) JRoger | 园豆:258 (菜鸟二级) | 2014-02-21 13:52

@JRoger: 

我就是看了这个之后再模仿着做的。

支持(0) 反对(0) seewold | 园豆:109 (初学一级) | 2014-02-21 14:59

@seewold: e.Handled在你另外的方法里面有体现吗?得用它终结路由。

支持(0) 反对(0) JRoger | 园豆:258 (菜鸟二级) | 2014-02-21 16:45

@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);
                }
            }

        }

这样就不会执行两次。

 

支持(0) 反对(0) seewold | 园豆:109 (初学一级) | 2014-02-21 17:47
0

这样就不会执行两次

seewold | 园豆:109 (初学一级) | 2014-02-25 15:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册