C#WPF – DragMove并单击

我需要一个控件来调用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 }); 

谁有更好的?

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

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

 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对移动的概念。