wpf 可扩展ListView的高度超过窗口高度

nafvub8i  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(281)

我有一个用户控件ListView1.xaml,看起来像这样:

<Grid>
 <ListView ItemSource="{Binding}">
  ...
 </ListView>
</Grid>

在我的窗口中,我使用了3次这个控件。

<Grid>
 <Grid.RowDefinitions>
  <RowDefinition Height="*"/>
  <RowDefinition Height="*"/>
  <RowDefinition Height="*"/>
 </Grid.RowDefinitions>
 <Expander Grid.Row="0" VerticalAlignment="Top">
  <local:ListView1 DataContext="{Binding Source1}"/>
 </Expander>
 <Expander Grid.Row="1" VerticalAlignment="Top">
  <local:ListView1 DataContext="{Binding Source2}"/>
 </Expander>
 <Expander Grid.Row="2" VerticalAlignment="Top">
  <local:ListView1 DataContext="{Binding Source3}"/>
 </Expander>
</Grid>

当我为每个Grid.Row设置Height="*"时,它会将空间平均分为3个。即使前2个标签页没有展开,它也会占用空白空间:

如果我设置Height="auto",它将具有我所寻找的内容:折叠选项卡时,仅展开选项卡:

但是Height="auto"的一个问题是ListView上没有滚动条,因为ListView的高度扩展到超过了窗口的高度。当内容大于窗口时,我如何能够保持扩展器的这种行为,并为每个ListView提供滚动条?

nlejzf6q

nlejzf6q1#

我会考虑为这种UI使用一个选项卡控件。
问题的一部分是,当网格的所有行都是自动的时,网格的大小没有调整到其父级。
如果你从使用网格改为使用停靠面板,那么你会得到滚动条。
当你展开第二个扩展器时,你必须决定你想要发生什么,你必须关闭第一个扩展器或者重新计算你想要每个扩展器在代码中的大小。
但我觉得这个更接近实用。
我的最小复制使用列表框。

<DockPanel>
    <Expander DockPanel.Dock="Top">
        <ListBox ItemsSource="{Binding IntList}"/>
    </Expander>
    <Expander DockPanel.Dock="Top">
        <ListBox ItemsSource="{Binding IntList}"/>
    </Expander>
    <Expander DockPanel.Dock="Top">
        <ListBox ItemsSource="{Binding IntList}"/>
    </Expander>
</DockPanel>

我的视图模型:

public partial class MainWindowViewModel : ObservableObject
{
    public List<int> IntList { get; set; } = new();
    public MainWindowViewModel()
    {
        for (int i = 0; i < 300; i++)
        {
            IntList.Add(i);
        }
    }

相关问题