Сделать привязку изменения размера к определенной ширине окна

Фон: у меня есть окно, которое начинается с ширины 240 пикселей, некоторые визуальные элементы могут отображаться только определенным образом при этой ширине, однако изменение размера разрешено и должно быть разрешено.

Если кто-то решит изменить размер, мне понадобится какая-то «привязка», чтобы вернуться к исходной ширине. Было бы мучительно/почти невозможно требовать от пользователей точного определения пикселей для восстановления полных визуальных эффектов.

Вопрос. Итак, как мне сделать так, чтобы при перемещении на определенное расстояние (скажем, в пределах 4 пикселей) от 240 пикселей в любом направлении он привязывался к этой ширине и изменялся в соответствии с другим размером. размер только тогда, когда курсор изменения размера отклонился более чем на 4 пикселя от ширины.

Неудачные идеи: я играл с несколькими разными вещами, которые устанавливают ширину окна на 240 в событии sizeChanged, если оно находится в пределах 4 пикселей, но, поскольку это относится к событию размера, оно будет выполнять вычисления после размер окна уже изменился. это означает, что вы получаете действительно прерывистый эффект, когда он изменяется до ширины по умолчанию или от нее.


person caesay    schedule 05.02.2011    source источник
comment
Если у вас есть только поле в 4 пикселя для изменения размера туда и сюда, я бы рекомендовал вообще не изменять размер окна и сделать его фиксированным. Пользователь не получит никакого видимого пространства всего за 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
Другими словами, если они изменяют размер и находятся в пределах 4 пикселей от 240, привязывайтесь к этому.   -  person caesay    schedule 05.02.2011
comment
Это довольно легко сделать в WinForms, переопределив метод WndProc и прослушивая сообщения Windows, соответствующие событиям изменения размера. Это устраняет изменчивость обработки событий, вызванных формой. Однако понятия не имею, работает ли это для WPF. У меня недостаточно опыта в этой среде.   -  person Cody Gray    schedule 05.02.2011
comment
@Cody Gray: я подумал, что это будет что-то с 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