Улавяне на 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? (Имаше няколко отрицателни -казващи в тази връзка, които заявяват, че 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