Перехват MouseMove при перемещении окна с помощью DragMove

У меня есть окно WPF без полей (WindowStyle="None"), которое можно перемещать, ловя LeftMouseDown, а затем вызывая DragMove. Это прекрасно работает.

Однако я хочу, чтобы какая-либо часть окна не покидала область экрана. Я ловлю LocationChanged, но это вызывается ПОСЛЕ того, как окно уже переместилось, и, таким образом, любые изменения положения окон, которые я делаю в этом событии, заставляют окно отпрыгивать назад, что выглядит очень непрофессионально.

Есть ли событие, которое я могу поймать, которое запускается ДО того, как окно будет фактически перемещено. Я пробовал MouseMove и PreviewMouseMove, но они не срабатывают во время DragMove.

Этот материал отлично работает с WinForms.

У кого-нибудь есть решение для этого, или это просто из-за полусырого характера и состояния WPF?


person Harald    schedule 30.11.2011    source источник


Ответы (2)


У меня не работает подход CoerceValueCallback (если у кого-то есть решение для этого подхода, поделитесь им).

Мое решение: перехватить сообщение WM_WINDOWPOSCHANGING в WPF WndProc. Решение немного длинное, чтобы публиковать его здесь, но вот 2 ссылки, которые указывают мне правильный путь:

Как обрабатывать сообщения WndProc в WPF? (было несколько вопросов, -sayers в этой ссылке, в которых говорилось, что WndProc не будет работать с WPF. Я не могу комментировать утверждение в таком общем виде, но в этом конкретном случае это работает как шарм.)

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

Поместите тело OnPreviewPositionChange в WndProc.

person Harald    schedule 02.12.2011

Этот материал отлично работает с WinForms

Да, но с другой стороны, в WinForms нет DragMove... Можно попробовать сделать так же, как в WinForms, обработав MouseMove и переместив окно самостоятельно.

Другой вариант — переопределить метаданные для свойств зависимостей Top и Left с помощью CoerceValueCallback, чтобы окно не покидало экран. Хотя не уверен, что это сработает...

person Thomas Levesque    schedule 30.11.2011
comment
Спасибо, Томас. Я рассмотрю CoerceValueCallback. - person Harald; 30.11.2011