Список внутри ScrollViewer вычислений высоты

Когда я помещаю ListBox в ScrollViewer, если я не определяю атрибут Height для ListBox, он не прокручивается (за исключением небольшого подпрыгивания вверх и вниз), поэтому элементы за пределами экрана недоступны. Если я установлю для атрибута Height в ListBox фактическую высоту, которую он занимает на экране, он отлично прокручивается. Если я не понимаю высоту, она не прокручивается должным образом, например. Возможно, мне не удастся добраться до нижних элементов списка.

При размещении других элементов в сетке LayoutRoot Grid с одним столбцом выше и ниже ScrollViewer / ListBox я устанавливаю RowDefinition.Height = "Auto" для всех строк, кроме ScrollViewer, который получает "*". Кажется, что сетка правильно распределяет пространство соответственно. За исключением того, что я априори не знаю, сколько места занимает ScrollViewer / ListBox.

Часть A: Почему я должен устанавливать высоту в ListBox, разве его (виртуальная) высота не зависит от количества элементов?

Часть B: Похоже, мне нужно вручную разложить высоту строк сетки, а затем вручную переделать их, если требуется изменить размер шрифта или другое изменение стиля. Так ли это? Такой подход кажется фальшивым.


person Paul Schmidt    schedule 12.04.2011    source источник
comment
Это становится еще более странным: мне нужен список с несколькими популярными элементами вверху, невыбираемой строкой и полным списком внизу. Если я помещаю эти три элемента в сетку, содержащуюся в ScrollView, прокручивается только нижний ListBox, а не вся сетка. Это совершенно не интуитивно. Даже неверно.   -  person Paul Schmidt    schedule 12.04.2011


Ответы (1)


Ваши проблемы вызваны тем, что у вас есть ListBox внутри ScrollViewer. Не делай этого.

Listbox содержит внутренний ScrollViewer и (обычно) вырастает до доступного пространства.

По сути, имея ScrollViewer внутри ScrollViewer, он не знает, какой из них должен расти, чтобы соответствовать доступному пространству, и как они должны прокручиваться относительно друг друга.

Сообщите нам, что вы пытаетесь сделать. Есть способ лучше.

person Matt Lacey    schedule 12.04.2011
comment
Ах. Если кто-то упомянул об этом на других форумах, я это пропустил. С этим исправлением он делает почти то, что я хочу. В идеале я хотел бы поместить разделитель (я использую границу с минимальной высотой) внутри ListBox для разделения двух разделов вместо использования двух списков, разделенных рамкой. Причина, по которой я сделал это вторым способом, заключается в том, что ListBox позволяет выбирать границу. Я могу проигнорировать выбранное событие для него, но анимация / выделение все равно происходит. - person Paul Schmidt; 12.04.2011
comment
Однако я собираюсь отметить исходный вопрос как ответ. Спасибо! - person Paul Schmidt; 12.04.2011
comment
Хорошо, выяснил проблему границы с помощью ListBoxItems в коде программной части. - person Paul Schmidt; 13.04.2011
comment
Я не согласен - я обнаружил, что ScrollViewer в ListBox не прокручивается плавно, а привязывается к высоте отдельных элементов, это может вызвать проблемы, когда высота может быть больше. Установка ScrollViewer.HorizontalScrollBarVisibility и ScrollViewer.VerticalScrollBarVisibility на Hidden и инкапсуляция ListBox в ScrollViewer действительно решает эту проблему и позволяет плавную прокрутку. Я не изучал, можно ли включить плавную прокрутку в ListBox ScrollViewer, поскольку это, возможно, более элегантное решение. - person Duncan Watts; 13.07.2011