Поймать MouseMove при перемещении окна с помощью DragMove - PullRequest
1 голос
/ 30 ноября 2011

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

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

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

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

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

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

0 голосов
/ 30 ноября 2011

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

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

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

...