没有边框的可拖动 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中,当在无边框窗口中拖动自定义的标题栏时,窗口会恢复,如何实现呢?
Tkinter:鼠标拖动一个没有边框的窗口,例如。覆盖直接(1)