我有一个无边框的WPF窗口(WindowStyle =“None”),可以通过捕获LeftMouseDown然后调用DragMove来移动它。这很好。
但是,我想阻止窗口的任何部分离开屏幕区域。 我抓住了LocationChanged,但是在窗口已经移动之后调用它,因此我在该事件中对窗口位置所做的任何更改都会导致窗口跳回,这看起来非常不专业。
在实际移动窗口之前,是否有可以捕获的事件被触发。 我尝试过MouseMove和PreviewMouseMove,但是在DragMove期间它们不会被触发。
这个东西适用于WinForms。
有没有人为此解决这个问题,还是仅仅因为WPF的半生不熟的性质和状态?
答案 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
覆盖Left
和CoerceValueCallback
依赖项属性的元数据,以防止窗口离开屏幕。不确定这是否会奏效,但是......