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