无边框可拖动的WPF窗口

7

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

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

这个方法有些可行,只要我在MainWindow内部的任何位置左键单击,就可以将窗口拖动到任何地方,只要不是在任何控件上。因为那就会出现问题。我有一个文本框,它占据了窗口内部的所有空间,一旦这样做,当我在文本框内左键单击时,就无法再移动窗口了。
如何让窗口在用户左键单击窗口内部并拖动鼠标时无论点击哪个控件都可以移动?
或者更简单地说,如何使窗口在用户在文本框控件内左键单击并拖动时移动?
1个回答

6

使用隧道式的MouseDown事件,即窗口的PreviewMouseLeftButtonDown事件。这样可以确保事件在窗口和其子控件上都发生:

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

你也可以手动为TextBox添加事件:
textBox.MouseDown += (s, e) => DragMove();

但是:

按照自己的意愿操作也有其固有问题。这样做将无法选择文本框中的文本。有一个解决方法 - 使用键盘 + 鼠标拖动输入,如下所示:

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(); };
}

我喜欢这个解决方案,即使需要按住ctrl键才能移动窗口。我觉得这很合理。 - Daniel Jørgensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接