无边框的可拖动WPF窗口

本文关键字:WPF 窗口 拖动 边框 | 更新日期: 2023-09-27 18:28:45

我正在使用WindowStyle=None来删除WPF窗口的边框。在MainWindow.xaml.cs文件中,我刚刚向构造函数添加了以下行:

this.MouseLeftButtonDown += delegate { this.DragMove(); };

这在一定程度上起作用,让我可以将窗口拖动到主窗口内左键单击的任何位置,只要它不在任何控件上。因为这就是我遇到问题的地方。我有一个文本框,它占据了窗口内的所有空间,一旦我这样做,当我在文本框内左键单击时,我就无法再移动窗口了。

如果用户在窗口内左键单击并拖动鼠标,无论用户正在点击什么控件,我如何使窗口四处移动?

或者更简单地说,当用户在文本框控件内左键单击和拖动时,我如何使窗口移动?

无边框的可拖动WPF窗口

使用隧道MouseDown事件,即Window的PreviewMouseLeftButtonDown事件。这将确保事件同时发生在窗口及其子控件上:

this.PreviewMouseLeftButtonDown += (s, e) => DragMove();

您也可以手动将事件添加到TextBox中:

textBox.MouseDown += (s, e) => DragMove();

但是

做你想做的事有它固有的问题。它不允许您在TextBox中选择文本。有一个变通方法-使用Key + MouseDrag输入,如下所示:

bool isKeyPressed = false;
public MainWindow()
{
    InitializeComponent();
    this.PreviewKeyDown += (s1, e1) => { if (e1.Key == Key.LeftCtrl) isKeyPressed = true; };
    this.PreviewKeyUp += (s2, e2) => { if (e2.Key == Key.LeftCtrl) isKeyPressed = false; };
    this.PreviewMouseLeftButtonDown += (s, e) => { if (isKeyPressed) DragMove(); };
}