使用DragMove移动窗口时捕获MouseMove

时间:2011-11-30 01:16:45

标签: wpf window move mousemove

我有一个无边框的WPF窗口(WindowStyle =“None”),可以通过捕获LeftMouseDown然后调用DragMove来移动它。这很好。

但是,我想阻止窗口的任何部分离开屏幕区域。 我抓住了LocationChanged,但是在窗口已经移动之后调用它,因此我在该事件中对窗口位置所做的任何更改都会导致窗口跳回,这看起来非常不专业。

在实际移动窗口之前,是否有可以捕获的事件被触发。 我尝试过MouseMove和PreviewMouseMove,但是在DragMove期间它们不会被触发。

这个东西适用于WinForms。

有没有人为此解决这个问题,还是仅仅因为WPF的半生不熟的性质和状态?

2 个答案:

答案 0 :(得分:1)

我没有得到CoerceValueCallback方法(如果有人有这种方法的解决方案请分享)。

我的解决方案: 拦截WPF WndProc中的WM_WINDOWPOSCHANGING消息。解决方案有点长,可以在这里发布,但这里有2个链接让我走上正轨:

How to handle WndProc messages in WPF? (在这个链接中有一些不同的说法者表示WndProc不能与WPF合作。 我不能用那种一般的方式评论这个陈述,但在这种特殊的情况下,它就像一个魅力。)

http://huddledmasses.org/wpf-windows-that-snap-to-screen-edges/

将OnPreviewPositionChange的正文放在WndProc中。

答案 1 :(得分:0)

  

这个东西适用于WinForms

是的,但另一方面,WinForms没有DragMove ...您可以尝试以与WinForms相同的方式执行此操作,方法是处理MouseMove并自行移动窗口。

另一种选择是使用Top覆盖LeftCoerceValueCallback依赖项属性的元数据,以防止窗口离开屏幕。不确定这是否会奏效,但是......