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

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

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

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

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

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

【问题讨论】:

    标签: c# wpf draggable


    【解决方案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 来移动窗口。这对我来说很有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2014-05-23
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多