我需要一个控件来为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
});
有人有更好的吗?
答案 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对移动的概念。