Ловить мусимов во время перемещения окна с Dragmove

StackOverflow https://stackoverflow.com/questions/8319998

  •  25-10-2019
  •  | 
  •  

Вопрос

У меня есть безграничное окно 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 Чтобы окно не покинуло экран. Не уверен, что это сработает, хотя ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top