WPF Sizing Grid.Row к содержанию
У меня есть окно, которое использует SizeToContent="WidthAndHeight"
и у меня есть столбец, который имеет три строки в нем. Строки определяются как таковые:
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
Содержимое состоит из одной другой панели Grid на строку выше. Каждая из этих панелей содержит метку и ListBox. ListBox динамически добавляет или удаляет свое содержимое. Таким образом, он может иметь один элемент или 100 элементов.
Моя проблема заключается в следующем: когда мое приложение запускается, три вышеупомянутые строки имеют размер в соответствии с их содержимым. Так что выглядит довольно аккуратно. Если первая строка содержит только один элемент в ListBox, он будет иметь размер, достаточный для размещения этих элементов. Две другие строки (если они переполнены содержимым) разделят оставшееся пространство пополам и сделают полосы прокрутки видимыми, если пользователь захочет увидеть переполнения в каждой из них. Однако, как только я изменю размеры главного окна, три строки сразу же изменят свой размер, чтобы каждая из них имела одинаковую высоту, независимо от количества содержимого в них.
Я пытался с помощью Height="Auto"
в определениях строк внешней сетки; однако при этом размер каждой строки точно совпадает с содержимым, что приводит к их переполнению за пределами экрана, не включая полосы прокрутки.
Я перепробовал все известные мне настройки (ключ: знаю) и не смог их решить. А пока я избавился от SizeToContent
чтобы эта странная ошибка не произошла, но строки имеют размер, пропорциональный друг другу, независимо от количества содержимого в них... и я бы хотел, чтобы это было по-другому. Я не хочу статическую высоту для каждой строки, а хочу, чтобы они динамически изменяли свой размер в зависимости от количества содержимого в них, не выходя за пределы экрана.
Есть ли способ это исправить?
3 ответа
Чтобы сделать это правильно, вам придется сделать свой собственный заказ Panel
который обрабатывает распределение по размеру умнее, чем стандарт Grid
, Этот проект может быть хорошей отправной точкой: ConstrainingStackPanel
В вашем XAML вы можете привязать к свойству в вашей ViewModel
<Grid.RowDefinitions>
<RowDefinition Height="{Binding Row1Height}"/>
<RowDefinition Height="{Binding Row2Height}"/>
<RowDefinition Height="{Binding Row3Height}"/>
</Grid.RowDefinitions>
Тогда в вашей ViewModel
public int Row1Height { get; set; }
public int Row2Height { get; set; }
public int Row3Height { get; set; }
И есть некоторые вычисления, которые заполняют это значение, как только у вас есть контент.
Предполагая, что я правильно понимаю ваш вопрос, вы пытались обернуть его внутри ScrollViewer и отключить полосу прокрутки для ListView?
Я обнаружил, что рендеринг макетов в WPF может быть как положительным, так и опорным. Иногда бывает неприятно заставить его работать правильно, когда дело доходит до определения размера контента.
Если ScrollViewer - это не тот подход, который вы хотели бы использовать, вы могли бы легко выполнить что-то подобное, написав какое-то прикрепленное поведение (я делал это в прошлом), но в этом случае это слишком излишне.
Пример подхода ScrollViewer:
<Grid>
<ScrollViewer>
<ListView ItemsSource="{Binding Something}" ScrollViewer.VerticalScrollBarVisibility="Hidden">
:
:
:
</ScrollViewer>
</Grid>