没有边框的可拖动 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 窗口的主要内容,如果未能解决你的问题,请参考以下文章

在WPF中,当在无边框窗口中拖动自定义的标题栏时,窗口会恢复,如何实现呢?

WPF 窗口仅垂直拖动

Tkinter:鼠标拖动一个没有边框的窗口,例如。覆盖直接(1)

MFC中无边框窗口的拖动 怎么添加WM_NCLBUTTONDOWN消息映射

如何在文件后面没有代码的情况下移动无边框 wpf 窗口

jqgrid 在拖动列时 能不能不显示 列的边框 虚线?