WPF 窗口仅垂直拖动

Posted

技术标签:

【中文标题】WPF 窗口仅垂直拖动【英文标题】:WPF Window Drag vertically only 【发布时间】:2016-07-25 13:57:52 【问题描述】:

我制作了一个自定义覆盖消息框(归结为无边框 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】:

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

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

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

【讨论】:

嗯,这并没有解决我的问题,但是您确实提到其他东西可能正在吞噬我的事件。我删除了 e.Handled = true 语句以及 CaptureMouse() 和 ReleaseMouseCapture(),并为我修复了它 - 所以我将其标记为解决方案 该死。我确实想知道e。把手。感谢您的勾选和投票!

以上是关于WPF 窗口仅垂直拖动的主要内容,如果未能解决你的问题,请参考以下文章

如何通过拖动扩展的窗口框架使 WPF 窗口可移动?

WPF 自定义的窗口拖动

WPF 自定义的窗口拖动

接收从网页拖动到 WPF 窗口的图像

WPF 窗口中的可拖动和自动调整用户控件

在WPF中,当在无边框窗口中拖动自定义的标题栏时,窗口会恢复,如何实现呢?