Пользовательская панель Silverlight: как повлиять на высоту ребенка?

Мои элементы на пользовательской панели не меняют свой размер, только клипы.

У меня есть панель размером до 400 пикселей и список в ней, полный элементов (с полосой прокрутки).

Я хотел бы, чтобы этот дочерний элемент занимал только половину высоты моей панели, как это в ArrangeOverride:

Children.Single().Arrange(
    new Rect(0, 0, child.DesiredSize.Width, finalSize.Height / 2));

Сначала это выглядело так, как будто это работало хорошо, но для реального размера списка не изменилось его все еще 400 пикселей, но видны только верхние 200 пикселей - они были обрезаны, а не изменены.

У меня панель посложнее, но все элементы в ней обрезаны. Любые намеки, что не так?


person Aurimas Neverauskas    schedule 14.12.2011    source источник


Ответы (2)


Составьте сетку из двух рядов высотой * и поместите свой список в верхний. Убедитесь, что для свойств scrollviewer.horizontalscrollbar / verticalscrollbar не задано значение hidden, и все должно быть в порядке.

Похоже, вы пытаетесь сделать это более сложным, чем должно быть.

person Malcolm O'Hare    schedule 14.12.2011
comment
Сетка мне не нужна. Мой вопрос в том, как повлиять на высоту ребенка на пользовательской панели, когда она обрезается. Проблема с сеткой заключается в том, что если бы мой список содержал один элемент, я бы получил огромный промежуток (половина экрана пуста) между списком и следующим элементом (если у меня 2 ребенка). - person Aurimas Neverauskas; 14.12.2011
comment
Тогда почему бы вам просто не установить MaxHeight для элемента, а затем вызвать Measure или Arrange без переопределений. - person Malcolm O'Hare; 14.12.2011
comment
MaxHeight можно установить только в пикселях. Его нельзя установить на *. В любом случае в настраиваемой панели я могу сказать, что мне нужно использовать 90% высоты для первого ребенка и 10% для второго в зависимости от обстоятельств. Моя проблема в том, что этих детей режут, но не усаживают. - person Aurimas Neverauskas; 14.12.2011
comment
В продолжение своего последнего комментария я имел в виду установить MaxHeight в коде, используя тот же метод, который вы использовали в вопросе. Так что-то вроде Children.Single().MaxHeight = finalSize.Height / 2. Вам, вероятно, потребуется выполнить приведение Children.Single () к ListBox. - person Malcolm O'Hare; 15.12.2011
comment
UIElements (Children) не являются объектами со статическим размером. Их размеры со временем меняются. Итак, если у меня есть двое детей, например, 50% и 50% при запуске, я мог бы установить их MaxHeight. Но при уменьшении - соотношение станет 60% к 40%, но, к сожалению, большее не будет расширяться, потому что оно уже ограничено MaxHeight. Также панель SizeChanged не срабатывает. Вот почему мне нужно создать настраиваемую панель, поскольку OverrideArrange выполняется в этих обстоятельствах. - person Aurimas Neverauskas; 16.12.2011

При создании настраиваемой панели размер дочерних элементов должен быть рассчитан в методе MeasureOverride, а не в Arrange. Перемещение кода из ArrangeOverride в MeasureOverride с некоторыми незначительными изменениями заставило настраиваемую панель работать должным образом.

Второй параметр для Arrange должен быть не меньше DesiredSize, рассчитанного в методе MeasureOverride. В противном случае товар будет обрезан.

person Aurimas Neverauskas    schedule 20.12.2011