Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使无窗口WPF窗口在不获取InvalidOperationException的情况下可拖动的方法_Wpf_Windowless - Fatal编程技术网

使无窗口WPF窗口在不获取InvalidOperationException的情况下可拖动的方法

使无窗口WPF窗口在不获取InvalidOperationException的情况下可拖动的方法,wpf,windowless,Wpf,Windowless,我有一个无边界的WPF主窗口。我正试图让最终用户可以拖动窗口 我已将以下内容添加到窗口的构造函数中: this.MouseLeftButtonDown += delegate { DragMove(); }; 问题是,我有一个对话框,打开时有两个按钮。当我单击其中一个按钮时,我会收到一个未处理的InvalidOperationException,消息为“只能在主鼠标按钮按下时调用DragMove” 这提出了几个问题: 为什么对话框中的mousedown事件与此有关? 没有这个例外,我怎么做 谢

我有一个无边界的WPF主窗口。我正试图让最终用户可以拖动窗口

我已将以下内容添加到窗口的构造函数中:

this.MouseLeftButtonDown += delegate { DragMove(); };
问题是,我有一个对话框,打开时有两个按钮。当我单击其中一个按钮时,我会收到一个未处理的InvalidOperationException,消息为“只能在主鼠标按钮按下时调用DragMove”

这提出了几个问题: 为什么对话框中的mousedown事件与此有关? 没有这个例外,我怎么做


谢谢

使无边框窗口可移动的“正确”方法是在WM_NCHITTEST消息中返回HTCAPTION。下面的代码显示了如何执行此操作。请注意,如果光标位于窗口的某些可视元素上,则需要返回HTCLIENT,因此此代码仅用于入门


有一个Microsoft项目可以处理所有的“无窗口”样式和更多的样式,它是开源的,您可能想看看。我在一个商业金融应用程序上使用,在任何版本的windows上都没有遇到任何问题。

设置窗口或任何其他要使用的控件的鼠标向下属性:

<TextBlock Grid.Column="0" HorizontalAlignment="Stretch"  MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" >Handy Dandy</TextBlock>

从:

您可以覆盖原始方法:

 public new void DragMove()
     {
        if (this.WindowState == WindowState.Normal)
        {
            SendMessage(hs.Handle, WM_SYSCOMMAND, (IntPtr)0xf012, IntPtr.Zero);
            SendMessage(hs.Handle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
        }
    }

我也有无边框的窗口和按钮,让用户拖动它按下鼠标左键,它的作品很好。请提供显示此行为的最小但完整的代码示例。如果您尝试按照Tergiver的建议“在WM_NCHITTEST消息中返回HTCAPTION”,则按钮将不可单击,即单击事件对按钮不起作用。有人对此有解决办法吗?请注意,我说过该代码只是一个起点。不能像上面的代码那样返回窗口整个矩形的HTCAPTION。您必须决定窗口的哪些区域不应为“标题”区域。这可能与控制区域中的矩形一样简单,也可能与遍历可视化树并查找控件一样复杂。
private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
     this.DragMove();
}
 public new void DragMove()
     {
        if (this.WindowState == WindowState.Normal)
        {
            SendMessage(hs.Handle, WM_SYSCOMMAND, (IntPtr)0xf012, IntPtr.Zero);
            SendMessage(hs.Handle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
        }
    }