Подтвердить что ты не робот

Протяните пустой WPF ListView, чтобы взять оставшееся пространство

У меня всегда возникают проблемы с ListView внутри динамического элемента управления макетами, например Stackpanel.

Прямо сейчас у меня есть Окно с Stackpanel как Root-Control. Stackpanel идеально подходит и занимает полное окно. Внутри StackPanel есть некоторые другие элементы управления, такие как текстовые поля и кнопка, все выровненные в порядке.

Последний объект - это ListView. Я хочу, чтобы ListView извлекал оставшееся пространство из StackPanel, но это не так. Даже с VerticalAlignment = "Stretch" Я получаю заголовки столбцов. ListView только увеличивается, когда элементы добавляются к нему. Поэтому я должен вручную установить высоту ListView.

Как я могу заставить ListView заполнить оставшееся пространство в StackPanel, даже когда оно пусто?

4b9b3361

Ответ 1

Это не имеет ничего общего с ListView. Это "ошибка" StackPanel. В StackPanel дочерние элементы всегда потребляют только необходимое пространство (в направлении ориентации StackPanel). Это то, как StackPanel разработан. Вместо этого используйте DockPanel, вы можете сделать последний элемент заполнить все оставшееся пространство, используя LastChildFill="true" (true по умолчанию, поэтому нет необходимости в его объяснении).

<DockPanel Background="Green">
    <Button DockPanel.Dock="Top">Text</Button>
    <ListView DockPanel.Dock="Top">
        <ListView.View>
            <GridView>
                <GridViewColumn/>
            </GridView>
        </ListView.View>
    </ListView>     
</DockPanel>

Ответ 2

Как насчет использования сетки? Сетки созданы для такого макета. DockPanel также является хорошим предложением.

  <Grid>  
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"/>
      <RowDefinition Height="Auto"/>
      <RowDefinition Height="*"/>
     </Grid.RowDefinitions>

   <TextBlock Grid.Row="0" Text="row1"/>
   <Button Grid.Row="1" Content="row2"/>
   <ListView Grid.Row="2">
     <ListViewItem Content="Text"/>
     <ListViewItem Content="Text1"/>
     <ListViewItem Content="Text2"/>
   </ListView>
  </Grid>

Важной частью является Height = "*", это говорит, что строка занимает все свободное пространство, вы можете оставить это, если хотите, поскольку это поведение по умолчанию.