WPF: Сделайте список во всю высоту родительского элемента, но также с возможностью прокрутки

#c# #.net #wpf

Вопрос:

У меня есть простое приложение с тремя столбцами в окне. В средней колонке у меня есть компонент списка.

Я хочу, чтобы список растягивался на всю высоту столбца, но также был доступен для прокрутки, когда в нем много всего. Прямо сейчас его нельзя прокручивать. Я могу исправить это, добавив Height к нему (например Height="300" ) свойство, но тогда оно больше не будет растягиваться вместе со столбцом. Что мне делать?

 <Window x:Class="UI.MainWindow"
    <!-- window stuff -->
<Border Padding="10">
    <StackPanel>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" MinWidth="150" MaxWidth="200" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <!-- column 1 stuff -->

            <StackPanel x:Name="LogLines" Grid.Column="1">
                <StackPanel Orientation="Horizontal">
                    <Label>Search</Label>
                    <TextBox x:Name="Searchbox" Height="20" TextWrapping="Wrap" Text="TextBox" Width="120" />
                    <CheckBox x:Name="ErrorsOnlyCheckbox" HorizontalAlignment="Right">
                        Errors only
                    </CheckBox>
                </StackPanel>

                <ListBox
                    x:Name="LogLinesList"
                    ScrollViewer.CanContentScroll="True" />
            </StackPanel>

            <GridSplitter Grid.Column="1" Width="10" />

            <!-- column 3 stuff -->
        </Grid>
    </StackPanel>
</Border>
</Window>
 

введите описание изображения здесь

Ответ №1:

Контейнер ваш ListBox есть StackPanel . StackPanel будет увеличиваться в отношении контроля над детьми. Вам следует использовать другой контейнер, попробуйте использовать Grid вместо него

 <Grid x:Name="LogLines" Grid.Column="1">
     <Grid.RowDefinitions>
         <RowDefinition Width="Auto"/>
         <RowDefinition Width="*" />
     </Grid.RowDefinitions>
    
     <StackPanel Orientation="Horizontal" Grid.Row="0">
          ....
     </StackPanel>
    
     <ListBox Grid.Row="1"/>
</Grid>
 

Комментарии:

1. Я реализовал это, но в итоге все равно возникла проблема. Однако затем я заметил, что все мое окно было завернуто в панель стека. Я удалил эту ненужную панель стека, и проблема была устранена.

2. О, я не обратил внимания на вторую панель стека. В любом случае, я рад, что вы решили проблему.