WPF窗口仅垂直拖动

时间:2016-04-05 14:39:30

标签: c# wpf draggable

我已经制作了一个自定义覆盖消息框(来自无边界的WPF窗口),它横跨整个屏幕的宽度。然而,我已经为用户实现了逻辑,以便能够拖动消息框,因为您可以将其配置为bot是一个叠加层,但是是一个正常大小的消息框。

使用叠加层,我想将拖动移动限制为仅包括垂直(向上/向下)更改,窗口不应该被水平拖动。

我将MouseDown事件连接到窗口中的边框,以便拖动窗口:

    private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
        if (msgType != MessageType.OverlayMessage && msgType != MessageType.OverlayMessageDialog) {
            this.DragMove(); // drags the window normally
        }
    }

我尝试的是捕捉鼠标按下事件上的光标,在MouseMove事件中执行拖动逻辑并在释放鼠标按钮时释放光标,但这不起作用 - 当我单击边框时,单击其他东西(远离窗口)并返回到边框,然后窗口按照我想要的方式捕捉到光标(仅垂直移动),但是当我单击并拖动光标:

    bool inDrag = false;
    Point anchorPoint;

    private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
        anchorPoint = PointToScreen(e.GetPosition(this));
        inDrag = true;
        CaptureMouse();
        e.Handled = true;
    }

    private void Border_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
        if (inDrag) {
            ReleaseMouseCapture();
            inDrag = false;
            e.Handled = true;
        }
    }

    private void Border_MouseMove(object sender, MouseEventArgs e) {
        if (inDrag) {
            Point currentPoint = PointToScreen(e.GetPosition(this));
            this.Top = this.Top + currentPoint.Y - anchorPoint.Y; // only allow vertical movements
            anchorPoint = currentPoint;
        }
    }

1 个答案:

答案 0 :(得分:1)

将以下内容添加到鼠标移动中:

if (e.LeftButton != MouseButtonState.Pressed) return;

此外,听起来其他东西可能会吞噬您的MouseUp事件。您正在处理PreviewMouseDown / Up还是只处于MouseDown / Up - 您可以尝试前者来获取隧道事件。