Направете преоразмеряване прилепване към определени ширини на прозорец

Фон: Имам прозорец, който започва с ширина 240 пиксела, някои визуални елементи могат да се показват само по определен начин при тази ширина, но преоразмеряването е разрешено и трябва да бъде разрешено.

Ако някой реши да преоразмери, тогава ще ми трябва някакъв вид "Snap", за да се върна към оригиналната ширина. Би било трудно/почти невъзможно да се изисква от потребителите да получат правилните точни пиксели, за да възстановят пълните визуални ефекти.

Въпрос: И така, как мога да направя така, че ако стигнат до определено разстояние (да речем, в рамките на 4px) от 240px в която и да е посока, то ще се прихване към тази ширина и ще преоразмери към различна размер само когато курсорът за преоразмеряване се е отклонил на повече от 4px от ширината..

Неуспешни идеи: Играх с няколко различни неща, които задават ширината на прозореца на 240 на събитието sizeChanged, ако е в рамките на 4px, но тъй като това е на събитието размер, ще направи изчисленията след прозорецът вече е преоразмерен. което означава, че получавате наистина накъсан ефект, когато се преоразмерява до/далеч от ширината по подразбиране.


person caesay    schedule 05.02.2011    source източник
comment
Ако имате само поле от 4px за преоразмеряване насам-натам, бих препоръчал изобщо да не преоразмерявате прозореца и да го направите Фиксиран. Потребителят няма да спечели никакво видимо пространство само с 4 пиксела   -  person Shekhar_Pro    schedule 05.02.2011
comment
... и какъвто и да е начин, по който искате да ви щракне на 240 пиксела, тогава защо изобщо да позволявате на потребителя да преоразмерява прозореца.. използвайте ленти за превъртане, ако имате допълнителна информация за показване   -  person Shekhar_Pro    schedule 05.02.2011
comment
ти изобщо не разбра въпроса, @Shekhar_Pro... Казах, че в рамките на 4px е ширината, която id би искал да прихвана до 240.. Прозорецът може да бъде с произволен размер, от ширина 10 до ширина 1000.   -  person caesay    schedule 05.02.2011
comment
Така че с други думи, ако преоразмеряват и са в рамките на 4px от 240, тогава прихванете към това.   -  person caesay    schedule 05.02.2011
comment
Това е доста лесно да се направи в WinForms чрез замяна на метода WndProc и слушане на съобщения на Windows, съответстващи на събития за преоразмеряване. Това елиминира накъсаното обработване на събитията, повдигнати от формуляра. Нямам идея обаче дали това работи за WPF. Нямам достатъчно опит в тази среда.   -  person Cody Gray    schedule 05.02.2011
comment
@Коди Грей: Реших, че ще бъде нещо с wndproc във WF. но това не е вариант за мен.   -  person caesay    schedule 05.02.2011
comment
@Cody: можеш ли да публикуваш отговор, който би го направил в WinForms? Мисля, че може да има начин да отмените WndProc и в WPF.   -  person caesay    schedule 05.02.2011
comment
@Tommy: Не, мисля, че първият ти инстинкт е правилен. Windows в WPF нямат hWnd. Просто не знам достатъчно за WPF, за да знам какво е възможно. Подобен въпрос показва, че начинът да замените WndProc в WPF е да използвате HWndHost, но това може дори да не работи както се очаква за това. Това чувство се подсилва още повече от аргументите, направени тук. (Има причина все още да не съм преминал към WPF...)   -  person Cody Gray    schedule 05.02.2011
comment
Ако работим с Win32, може да опитаме да подкласираме прозорец, който хоства WPF. Доколкото разбирам, това ще ни даде възможност да обработваме съобщенията, преди да преминат към прозоречната процедура на WPF.   -  person Marat Khasanov    schedule 05.02.2011


Отговори (1)


Ето съобщение, което обяснява как да получите прецизен контрол върху преоразмеряването чрез обработка на съобщението WM_SIZING във вашата собствена прозоречна процедура:

Примерният код на модератора е във VB, но има много примери за C#/WinForms, които можете да използвате, за да започнете.

person Rick Sladkey    schedule 05.02.2011
comment
Току-що използвах кода на VB за справка и написах собствената си версия на C#. Благодаря много! - person caesay; 06.02.2011