Ловить мусимов во время перемещения окна с Dragmove
Вопрос
У меня есть безграничное окно WPF (windowstyle = "none"), которое можно перемещать, поймав Leftmousedown, а затем вызовет Dragmove. Это работает нормально.
Тем не менее, я хочу не дать любой части окна покинуть область экрана. Я поймаю местоположение, но это называется после того, как окно уже перемещалось, и, следовательно, любые изменения в положении Windows, которые я делаю в этом событии, приводят к тому, что окно отскочит, что выглядит очень непрофессионально.
Есть ли событие, которое я могу поймать, которое уволено до того, как окно будет фактически перемещено. Я попробовал MouseMove и PreviewMouseMove, но их не уволят во время Dragmove.
Этот материал отлично работает с Winforms.
Есть ли у кого-нибудь решение для этого или это просто из-за наполовину выпеченной природы и состояния WPF?
Решение
Я не получил подход CoerceValueCallback для работы (если у кого -то есть решение для этого подхода, пожалуйста, поделитесь им).
Мое решение: перехватить сообщение WM_WINDOWPOSCHANGING в WPF WNDPROC. Решение немного долго публиковать здесь, но вот 2 ссылки, которые поставили меня на правильный путь:
Как обрабатывать сообщения wndproc в WPF?(В этой ссылке было несколько человек, которые заявили, что WNDPROC не будет работать с WPF. Я не могу комментировать это заявление таким общим образом, но в данном конкретном случае он работает как очарование).)
http://huddledmasses.org/wpf-windows-that-snap-to-creen-edges/
Поместите тело OnPreviewPositionChange в wndproc.
Другие советы
Этот материал отлично работает с Winforms
Да, но с другой стороны, у Winforms нет DragMove
... вы можете попытаться сделать это так же, как и в Winforms, обрабатывая MouseMove
и перемещать окно самостоятельно.
Другим вариантом было бы переопределить метаданные для Top
а также Left
свойства зависимости с CoerceValueCallback
Чтобы окно не покинуло экран. Не уверен, что это сработает, хотя ...