Dragmoveで窓を移動しながらMousemoveをキャッチします
質問
LeftMousownownをキャッチしてからDragMoveに電話することで移動できる、ボーダーレスWPFウィンドウ(WindowStyle = "NONE")があります。それは正常に機能します。
ただし、ウィンドウの一部が画面領域を離れるのを防ぎたいと思います。私は位置変化をキャッチしますが、それはウィンドウがすでに移動した後に呼び出されます。したがって、そのイベントで行う窓の位置に変更が窓がジャンプします。
ウィンドウが実際に移動する前に発射されるイベントはありますか? MouseMoveとPreviewMouseMoveを試しましたが、ドラッグモーブ中は解雇されません。
これはWinFormsで正常に動作します。
誰かがこれの解決策を持っているのですか、それともこれは、中途半端な性質とWPFの状態によるものですか?
解決
私は仕事に対するCoercevalueCallbackアプローチを取得しませんでした(このアプローチの解決策がある場合は、共有してください)。
私の解決策:WM_WINDOWPOSCHANGINGメッセージをWPF WNDProcでインターセプトします。解決策はここに投稿するのに少し長いですが、ここに私が正しい軌道に乗る2つのリンクがあります:
WPFでWNDProcメッセージを処理する方法は?(このリンクには、WNDProcがWPFで動作しないと述べたいくつかの否定的な人がいました。その一般的な方法で声明についてコメントすることはできませんが、この特定のケースでは魅力のように機能します。)
http://huddledmasses.org/wpf-windows-that-snap-to-screen-edges/
onpreviewpositionChangeのボディをWNDProcに置きます。
他のヒント
これはWinFormsで正常に動作します
はい、しかし一方で、winformsは持っていません DragMove
...あなたはwinformsと同じように、処理することによってそれをすることができます MouseMove
窓を自分で移動します。
別のオプションは、メタデータをオーバーライドすることです Top
と Left
aでの依存関係プロパティ CoerceValueCallback
ウィンドウが画面を離れるのを防ぐため。それがうまくいくかどうかはわかりませんが...