Доброго всем времени суток. Очень нужна ваша помощь. Проблема моя в следующем. Место действия WPF. Есть окно. В нем Grid. В этом Grid’e еще Grid. В котором в свою очередь находится ListBox. Во время выполнения программы в этот ListBox добавляются новые айтемы(ипользуется привязка к их массиву). При увеличении размера ListBox’a должно увеличиваться само окно. В принципе оно увеличивается, но только если курсором не поменять до этого исходные размеры окна. Вообщем ситуация такая. Если после открытия окна, не менять его исходных размеров то при увеличении ListBox’a увеличивается и размер окна. Но стоит только немного мышкой сузить или расширить размер окна, как ресайз отрубается, контент увеличиватся и выползает(по высоте) за границы окна. Само же окно не меняется не на миллиметр. Событие SizeChanged не вызывается. На сколько я понимаю, сдесь я имею дело с восходящим событием, т.е. оно от ListBox’a по гридам доходит до окна. Но при изменении исходных размеров окна, что то в этой схеме происходит. То ли ListBox сам не инициализирует событие, то ли оно теряется по дороге к окну. Поэтому у меня возникло несколько вопросов:
1)Как узнать какое именно событие стало причиной вызова SizeChanged у окна, то есть как прослидить всю цепочку событий от ListBox’a до окна. SizeChanged окна вызывается методом OnRenderSizeChanged, а кто вызывает этот метод?
2)Что такое страшное «ручной» ресайз сделал с окном, что оно перестает ресайзится автоматически.
3)А можно ли в ручную изменить размеры окна в WPF. Например при событии увеличения размера ListBox’a, вручную растянуть само окно. Я пробовал это провернуть с помощью
OnRenderSizeChanged(SizeChangedInfo sizeInfo), но в SizeChangedInfo нельзя явно задать новые размеры. Можно только передать обьект с такими размерами. Так что, этот вариант отпадает. Или нет и есть способ его обойти?
Буду очень признателен за любой совет. Возможно такой вопрос уже поднимался, и кто нибудь поделится ссылкой на форум( статью, ресурс). В любом случае очень надеюсь на вашу помощь, так как мне этот ресайз до зарезу как нужно отремонтировать. Заранее всем благодарен!!
Окно перестает менять свой размер, если выставлены ActualWidth / ActualHeight. При ручном изменении размеров именно это и происходит: ActualWidth/ActualHeight'у присваиваются значения.
Чтобы окно принимало размер содержимого, нужно чтобы wnd.Width & wnd.Height были равны Auto.
Попробуй подписаться на событие ресайза окно и там делать так: this.Width = this.Height = Double.NaN.
ЗЫ. проверить сейчас не могу, возможно будут бока во время ресайза
Здравствуйте, motormanyak, Вы писали:
M>Здравствуйте, stupidboy, Вы писали:
M>Окно перестает менять свой размер, если выставлены ActualWidth / ActualHeight. При ручном изменении размеров именно это и происходит: ActualWidth/ActualHeight'у присваиваются значения. M>Чтобы окно принимало размер содержимого, нужно чтобы wnd.Width & wnd.Height были равны Auto. M>Попробуй подписаться на событие ресайза окно и там делать так: this.Width = this.Height = Double.NaN.
M>ЗЫ. проверить сейчас не могу, возможно будут бока во время ресайза
К сожалению не работает. Width Height меняются на Double.NaN. Но окно все равно не ресайзится.
Здравствуйте, motormanyak, Вы писали:
M>Здравствуйте, stupidboy, Вы писали:
M>а если попробовать так
M>
M>this.SizeToContent = SizeToContent.WidthHeight; // могу ошибаться в названиях полей
M>
Огромное спасибо за внимание уделенное моей проблеме. Да таки я пробовал. Пожалуй это было первое что пришло в голову(отыскалось на форумах)
Но нет к сожалению это тоже не помогает.
Насколько я понимаю, в WPF нельзя просто взять и растянуть окно программно,руками. Все автоматизировано. Ох. Жаль.
Re: [WPF] сломался ресайз окна
От:
Аноним
Дата:
19.10.11 13:50
Оценка:
Здравствуйте, stupidboy, Вы писали:
S> В принципе оно увеличивается, но только если курсором не поменять до этого исходные размеры окна.
Очень подозреваю что при этом устанавливаются значения WIdth и Height окна. При добавлении Item попробуйте сбросить их на Double.NaN.
Совсем забыл сказать. Изначально параметр SizeToContent у окна выставлен в Manual. Высота и ширина авто. Но оно (в описываемом мною случае) ресайзится без проблем. Значит ресайз уже реализован, и без использования SizeToContent. И видимо этот метод ресайза мешает стандартному SizeToContent. Так вот вопрос, а как еще можно заставить менять размер окна при изменении размеров контента без SizeToContent? Какие еще есть способы. У этого окна есть какой то стиль. Может там что прописано? И можно ли эти самые способы как нибудь нейтрализовать, что бы SizeToContent заработал нормально. А еще у меня такое чувство, что Height и Width кто то переписывает, потому что не могу я их поменять.
Здравствуйте, stupidboy, Вы писали:
S>Совсем забыл сказать. Изначально параметр SizeToContent у окна выставлен в Manual. Высота и ширина авто. Но оно (в описываемом мною случае) ресайзится без проблем. Значит ресайз уже реализован, и без использования SizeToContent. И видимо этот метод ресайза мешает стандартному SizeToContent. Так вот вопрос, а как еще можно заставить менять размер окна при изменении размеров контента без SizeToContent? Какие еще есть способы. У этого окна есть какой то стиль. Может там что прописано? И можно ли эти самые способы как нибудь нейтрализовать, что бы SizeToContent заработал нормально. А еще у меня такое чувство, что Height и Width кто то переписывает, потому что не могу я их поменять. S>
Если для свойства SizeToContent задано значение WidthAndHeight, то задание Height либо Width влияния не окажет; можно задать оба свойства, но их значения не применяются к окну.
Если для свойства SizeToContent задано значение Height, то задание свойства Height не изменит высоту окна.
Если для свойства SizeToContent задано значение Width, то задание свойства Width не изменит ширину окна.
Если значение свойства SizeToContent отличается от Manual:
Для свойства SizeToContent автоматически устанавливается значение Manual, если пользователь изменит размер окна, воспользовавшись захватом или перетащив границу.
Если размер содержимого изменяется так, что заставляет окно изменять свои размеры, то инициируется событие SizeChanged.
Если окно является прозрачным (см. AllowsTransparency), рекомендуется установить для свойства SizeToContent значение WidthAndHeight, чтобы убедиться, что окно не больше его видимого содержимого.