【问题标题】:Catching MouseMove while moving window with DragMove使用 DragMove 移动窗口时捕捉 MouseMove
【发布时间】:2011-11-30 01:16:45
【问题描述】:

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

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

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

这些东西在 WinForms 上运行良好。

是否有人对此有解决方案,或者这仅仅是由于 WPF 的半生不熟的性质和状态?

【问题讨论】:

    标签: wpf window move mousemove


    【解决方案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。

    【讨论】:

      【解决方案2】:

      这些东西在 WinForms 上工作得很好

      是的,但另一方面,WinForms 没有DragMove...您可以尝试像在 WinForms 中一样,通过处理MouseMove 并自己移动窗口。

      另一种选择是使用CoerceValueCallback 覆盖TopLeft 依赖属性的元数据,以防止窗口离开屏幕。不过,不确定这是否可行...

      【讨论】:

      • 谢谢,托马斯。我会调查 CoerceValueCallback。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 2010-11-04
      • 2012-08-24
      • 2012-09-30
      • 2019-04-01
      相关资源
      最近更新 更多