我有一个窗口少WPF主窗口。我试图让它最终用户可以拖动窗口。
我已将以下内容添加到Window的构造函数中:
this.MouseLeftButtonDown += delegate { DragMove(); };
问题是,我有一个用两个按钮打开的对话框。当我单击其中一个按钮时,我得到一个未处理的InvalidOperationException,并显示消息“只能在主鼠标按钮关闭时调用DragMove。”
这提出了几个问题: 为什么对话框中的mousedown事件与此有关? 如果没有这个例外,我怎么能这样做?
谢谢!
答案 0 :(得分:7)
使无边框窗口可移动的“正确”方法是在WM_NCHITTEST消息中返回HTCAPTION。以下代码显示了如何执行此操作。请注意,如果光标位于Window的某些可视元素上,则需要返回HTCLIENT,因此此代码只是为了让您入门。
http://msdn.microsoft.com/en-us/library/ms645618(VS.85).aspx
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
protected override void OnSourceInitialized(EventArgs e)
{
HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(this);
hwndSource.AddHook(WndProcHook);
base.OnSourceInitialized(e);
}
private static IntPtr WndProcHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handeled)
{
if (msg == 0x0084) // WM_NCHITTEST
{
handeled = true;
return (IntPtr)2; // HTCAPTION
}
return IntPtr.Zero;
}
}
答案 1 :(得分:1)
设置窗口的ONMouseDown属性或您要使用的任何其他控件:
<TextBlock Grid.Column="0" HorizontalAlignment="Stretch" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" >Handy Dandy</TextBlock>
并在后面的代码中实现它:
private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.DragMove();
}
来自:http://www2.suddenelfilio.net/2007/01/19/wpf-draggable-windowless-windows/
答案 2 :(得分:0)
有一个Microsoft项目可以处理所有“无窗口”样式等等,而且它是开源的,您可能需要查看http://code.msdn.microsoft.com/WPFShell。我正在使用商业金融应用程序,并且尚未在任何版本的Windows上遇到任何问题。
答案 3 :(得分:0)
你可以覆盖原始方法:
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);
}
}