无边框的可拖动 WPF window

Draggable WPF window with no border

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

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

这有点管用,让我可以将 window 拖到 MainWindow 中我左键单击的任何地方,只要它不在任何控件上即可。因为那是我遇到问题的地方。我有一个文本框占据了 window 内的所有 space,一旦我这样做,我就无法再在文本框内左键单击时移动 window。

如果用户在 window 中左键单击并拖动鼠标,无论用户点击什么控件,我如何让 window 移动?

或者更简单,当用户左键单击并在文本框控件内拖动时,如何使 window 移动?

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

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

您也可以手动向文本框添加事件:

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

但是:

做自己想做的事情有其固有的问题。它不会让您在 TextBox 中输入 select 文本。有一个解决方法 - 使用这样的 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(); };
}