无边框的可拖动WPF窗口
本文关键字:WPF 窗口 拖动 边框 | 更新日期: 2023-09-27 18:28:45
我正在使用WindowStyle=None
来删除WPF窗口的边框。在MainWindow.xaml.cs文件中,我刚刚向构造函数添加了以下行:
this.MouseLeftButtonDown += delegate { this.DragMove(); };
这在一定程度上起作用,让我可以将窗口拖动到主窗口内左键单击的任何位置,只要它不在任何控件上。因为这就是我遇到问题的地方。我有一个文本框,它占据了窗口内的所有空间,一旦我这样做,当我在文本框内左键单击时,我就无法再移动窗口了。
如果用户在窗口内左键单击并拖动鼠标,无论用户正在点击什么控件,我如何使窗口四处移动?
或者更简单地说,当用户在文本框控件内左键单击和拖动时,我如何使窗口移动?
使用隧道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(); };
}