没有边框的可拖动 WPF 窗口

Posted

技术标签:

【中文标题】没有边框的可拖动 WPF 窗口【英文标题】:Draggable WPF window with no border 【发布时间】:2016-04-07 11:27:47 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

我喜欢这个解决方案,即使它要求您按住 ctrl 来移动窗口。这对我来说很有意义。

以上是关于没有边框的可拖动 WPF 窗口的主要内容,如果未能解决你的问题,请参考以下文章