Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Проблема с Measure


Автор: AleksPingvin 5.12.2011, 15:53
Есть UserControl который представляет некий заголовок, под которым находятся куча данных. У источника данных объекта есть поле Collapsed( нотифайное разумеется) , которое показывает, на то, как показывать объект - свернутым (только заголовок) или нет.
Примерно так:

Код

<StackPanel Name="container" Visibility="Visible">
....
</StackPanel>
....
....
....
<DataTriger Binding="{Binding Collapsed}" Value="True">
<Setter TargetName="container" Property="Visibility" Value="Collapsed"/>
</DataBinding>


Пишу свой контейнер, в методах MeasureOverride и AverrageOverride мне в случае если мой объект цельный и развернутый  не влезает в контейнер, то его надо свернуть.

Пишу примерно такой код (фрагмент AverrageOverride):

Код

MyData data = curItem.DataContext as MyData;
item.Measure(...);
if (item.DesiredSize.Height > lastHeight)
{
data.Collapsed = true;
item.Measure(....);
....
}

Так вот после изменения значения поля Collapsed и последующего измерения DesiredSize не изменилось. Да и визуально итем тоже не изменился.
Как быть?
Для теста вешал на клавишу изменения этого поля, в обычном контейнере все работает. Объект сворачивается и разворачивается. Но мне надо именно в MeasureOverride и AverrageOverride сколько будет занимать элемент в свернутом или не свернутом виде. Подскажите как быть?

Автор: Gvozdin 5.12.2011, 16:16
Значит если ваш контейнер(который вместо StackPanel Name="container") не помещается целиком в availableSize в ArrangeOverride, то вы идете в дата контекст и устанавливаете там Collapsed = true.

А почему вы думаете что Visibility вашей панели должен как-то повлиять на DesiredSize у ваших дочерних элементов? Вы спрашиваете их сколько они ХОТЯТ занять места, они и отвечают сколько они хотят.

Если вы хотите что бы панель скрывалась когда она полностью не входит в контейнер то я бы предложил другой вариант:
1. Создаете dependency property HeighIsNotEnoughtForMe
2. В ArrangeOverride, если заданный availableSize вам мал, устанавливаете HeighIsNotEnoughtForMe = true
3. Тригером по HeighIsNotEnoughtForMe делаете вашей панели Visibility=Collapsed

Автор: AleksPingvin 5.12.2011, 18:25
Я опечатался в коде )) везде item это curItem. Т.е я беру итем и у его данных меняю свойство и жду изменентя его размеров

Автор: Gvozdin 5.12.2011, 20:08
От этого ничего не меняется

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)