如何在不获取InvalidOperationException的情况下使Windowless WPF窗口可拖动

rst*_*kly 8 wpf windowless

我有一个窗口少WPF主窗口.我试图让它最终用户可以拖动窗口.

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

this.MouseLeftButtonDown += delegate { DragMove(); };
Run Code Online (Sandbox Code Playgroud)

问题是,我有一个用两个按钮打开的对话框.当我单击其中一个按钮时,我得到一个未处理的InvalidOperationException,并显示消息"只能在主鼠标按钮关闭时调用DragMove".

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

谢谢!

Ter*_*ver 8

使无边框窗口可移动的"正确"方法是在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;
    }
}
Run Code Online (Sandbox Code Playgroud)