不出现窗口的WPF窗口如何实现可拖动,避免InvalidOperationException异常

9

我有一个无边框的WPF主窗口。我想让终端用户能够拖动窗口。

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

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

问题是,我有一个带有两个按钮的对话框。当我点击其中一个按钮时,会出现一个未处理的InvalidOperationException异常,其中包含消息“仅在按下主鼠标按钮时才能调用DragMove。”

这引发了一些问题: 为什么对话框中的mousedown事件与此有关? 如何避免此异常?

谢谢!


我还有没有边框的窗口,带有按钮,并且允许用户通过按下左键拖动它,这个功能很好用。请提供一个最小但完整的代码示例来展示这种行为。 - Wallstreet Programmer
4个回答

8
“正确”的方法是在WM_NCHITTEST消息中返回HTCAPTION,以使无边框窗口可移动。以下代码展示了如何实现此功能。请注意,如果光标位于窗口的某些可视元素上方,则应返回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;
    }
}

如果您像Tergiver建议的那样尝试在WM_NCHITTEST消息中“返回HTCAPTION”,则按钮将无法点击,即按钮的单击事件将无效。有没有其他解决方法? - user427818
请注意我之前所说的那段代码仅为起始点。你不能像上面的代码一样返回整个窗口的HTCAPTION。你必须决定哪些区域不应该是“标题”区域。这可能只是您控件区域内的矩形,也可能需要遍历可视树并查找控件。 - Tergiver

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/


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);
        }
    }

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接