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>
Другие вопросы по тегам