【问题标题】:C# WPF - DragMove and clickC# WPF - DragMove 并单击
【发布时间】:2023-03-21 12:44:01
【问题描述】:

我需要一个控件来为 MouseLeftButton 上的窗口调用 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();
                                }
                            });
                    });

编辑:这个 hack 奏效了……

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

谁有更好的?

【问题讨论】:

  • 拖动窗口时需要单击/鼠标上键来做什么?
  • 我们的设计在角落有一个图标,允许 DragMove,但如果你点击它,它会在窗口的一部分上切换面板的扩展。

标签: c# .net wpf xaml


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • StartDrag 方法有什么作用?您只是设置 Left 和 Top 属性吗?我认为这会在 XP 上严重闪烁。
    • StartDrag() 只是对象上的一个方法,它执行我所做的拖放处理。我用我当时需要的任何东西替换它,在你的情况下你会调用 DragMove()。这是从 Drap/Drop 辅助类中剥离出来的,它可以做更多的事情。
    • 那么您的示例不起作用。 DragMove() 会阻止 MouseLeftButtonUp 被触发,除非你使用我上面的一个技巧,而第二个到目前为止工作得很好——它只是相当难看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多