проблема с панелью управления wpf

#wpf #listview #dockpanel

#wpf #listview #панель управления

Вопрос:

У меня есть DockPanel с ListView и StackPanel:

 <DockPanel Margin="5" LastChildFill="True">
    <ListView Margin="5" ItemsSource="{Binding Source={StaticResource taxGroupSource}}" DockPanel.Dock="Top" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding SerialNumber}" />
                <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding Name}" />
            </GridView>
        </ListView.View>
    </ListView>
    <StackPanel DockPanel.Dock="Bottom" Style="{StaticResource buttonPanel}">
        <Button Content="Close" Click="CloseClick"/>
    </StackPanel>
</DockPanel>
  

Когда в GridView большое количество строк, ListView перекрывает нижнюю панель стека. Почему?

Ответ №1:

Я считаю, что проблема LastChildFill в DockPanel вас самих. Как объясняется MSDN, LastChildFill делает так, чтобы ваша StackPanel занимала оставшееся место в DockPanel, даже если вы установили его для закрепления внизу. Попробуйте удалить атрибут и посмотреть, поможет ли это.

Редактировать: удаление одного атрибута этого не делает. Я получил ожидаемое поведение, поменяв местами ListView и StackPanel, но это меняет порядок табуляции (хотя здесь он находится только между двумя элементами, поэтому установка фокуса на ListView делает его правильным).

В качестве альтернативы, можете ли вы использовать сетку с двумя строками — ListView в первой строке с высотой «*» и StackPanel во второй с высотой «Auto»? Или это упрощение более сложного макета, где это не сработает?

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

1. Возможно, я попробую решение с помощью grid.

Ответ №2:

Как сказал @DocMax, последнее дочернее заполнение будет работать, ТОЛЬКО если в dockpanel останется свободное место после того, как все предыдущие дочерние элементы будут заняты. При ListView наличии большого количества строк пространство уже занято им, поэтому в stackpanel не остается свободного места.

Я предлагаю вам указать некоторую минимальную высоту для stackpanel.

Ответ №3:

Если вы не хотите использовать Grid, вы можете решить ее, добавив сначала StackPanel, а затем ListView с помощью using LastChildFill="True" .