Короткая версия: удалить Grid.RowSpan
из расширителя.
Длинная версия:
Фон: (очень широкими мазками)
Когда вы определяете высоту RowDefinition
, могут произойти три вещи, в зависимости от того, какие единицы измерения вы используете:
- Пиксель - любой элемент UIElement, помещенный в эту строку, будет иметь определенную высоту строки, переданную методам
Measure
и Arrange
элемента.
- Авто - сетка пройдет бесконечность как высоту для
Measure
, а затем element.DesiredSize.Height
для Arrange
.
- Звезда - сетка будет учитывать высоту всех строк с единицами пикселей и авто; вычислите высоту, оставшуюся от ее доступной высоты, и разделите ее на «общее количество звезд», которые были определены для всех рядов - это высота одной звезды; затем каждая высота строки назначается в зависимости от множителя для его определения звезды; эта высота передается методам
Measure
и Arrange
.
Та же логика применяется к определениям столбцов только в отношении ширины, а не высоты.
Итак, определение «звезда» «останавливает» элемент, определение пикселя также «останавливает», но оно может находиться за пределами визуализированного представления, а автоматическое определение «позволяет» элементу иметь любой размер, какой он хочет.
Вся эта логика рекурсивна, поэтому вам нужно думать в двух направлениях (объяснение ниже).
В вашем случае
В одну сторону. ListBox
находится в звездном ряду, поэтому он будет остановлен. Родительская сетка также останавливается (поскольку шаблон для расширителя использует DockPanel
, который также является «панелью остановки»). Расширитель определен, чтобы начинаться в ряду звезд, но он охватывает автоматический ряд - это означает, что ему будет позволено расти в высоту 'до бесконечности. Упс ... время повернуть вспять.
Теперь обратное направление. Расширитель не останавливается, дочерняя сетка не останавливается (поскольку сетка предполагает, что она имеет бесконечную доступную высоту), поэтому список не останавливается, ScrollViewer
в шаблоне списка не останавливается, поэтому он ViewportHeight
является бесконечным, для VirtualizingStackPanel
, который упорядочивает элементы (и является дочерним элементом средства просмотра прокрутки), это означает, что все элементы находятся в представлении == отображать все элементы.
Для окна WPF с шаблоном по умолчанию вы всегда можете предположить, что окно останавливает свой дочерний элемент. Поэтому, если удаление определения диапазона строк не решило проблему, продолжайте обход, пока не найдете другой элемент, который не останавливает его дочернюю высоту, и не измените его определения или не измените панель, чтобы остановить рост высоты до бесконечности (средства просмотра прокрутки печально известны создание этих поведений, особенно тех, которые скрыты в шаблонах).