9

我有一个无边框的 WPF 主窗口。我正在努力做到这一点,以便最终用户可以拖动窗口。

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

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

问题是,我有一个带有两个按钮的对话框。当我单击其中一个按钮时,我得到一个未处理的 InvalidOperationException,并显示消息“只能在主鼠标按钮按下时调用 DragMove”。

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

谢谢!

4

4 回答 4

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;
    }
}
于 2010-07-18T13:37:47.223 回答
1

设置窗口的 MouseDown 属性或您要使用的任何其他控件:

<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/

于 2012-03-13T17:08:48.500 回答
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);
        }
    }
于 2012-07-27T16:16:18.470 回答
0

有一个 Microsoft 项目可以处理所有“无窗口”样式等等,它是开源的,您可能想看看http://code.msdn.microsoft.com/WPFShell。我正在使用商业金融应用程序,并且在任何版本的 Windows 上都没有遇到任何问题。

于 2010-08-29T14:13:58.437 回答