C#WPF - DragMove并单击

时间:2009-12-16 19:47:52

标签: c# .net wpf xaml

我需要一个控件来为MouseLeftButton上的Window调用DragMove(),但在单击时仍然可以运行。

如果调用DragMove(),则不会触发Click和MouseLeftButtonUp,因为DragMove()是一个阻塞调用,直到它们释放鼠标按钮。

有没有人知道使其成功的解决方法?

我已经尝试过基于Thread.Sleep的这个hack,它允许点击工作,如果它快于100毫秒,但它对用户不起作用:

                ThreadPool.QueueUserWorkItem(_ =>
                    {
                        Thread.Sleep(100);

                        Dispatcher.BeginInvoke((Action)
                            delegate
                            {
                                if (Mouse.LeftButton == MouseButtonState.Pressed)
                                {
                                    window.DragMove();
                                }
                            });
                    });
编辑:这个黑客工作了......

                window.DragMove();
                RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, MouseButton.Left) 
                    { 
                        RoutedEvent = MouseLeftButtonUpEvent 
                    });

有人有更好的吗?

2 个答案:

答案 0 :(得分:2)

我相信上面的编辑是最好的解决方案。

答案 1 :(得分:0)

如果您想要两种行为,那么您将不得不同时捕获鼠标和鼠标移动事件。在鼠标按下时,您保存当前鼠标位置:

StartPosition = event.GetPosition(ui_element);

然后在鼠标移动中,只有当鼠标按钮仍然按下并且鼠标移动得足够时才开始拖动:

        if (e.LeftButton == MouseButtonState.Pressed) {
        Point position = e.GetPosition(Scope);
        if (Math.Abs(position.X - StartPoint.X) > SystemParameters.MinimumHorizontalDragDistance ||
            Math.Abs(position.Y - StartPoint.Y) > SystemParameters.MinimumVerticalDragDistance) {
            StartDrag(e);
        }
    }

SystemParameters对象定义了Windows对移动的概念。