WPF XAML 中的 ListView 和 StackPanel 有什么区别?

问题描述 投票:0回答:1

我遇到了显示多个子元素的问题,使用 ListView 时出现水平问题,使用 StackPanel 时出现垂直问题。也许我应该使用另一个集合控件?

要显示的内容是一组项目,每个项目都有一个 Expander 和一个 DataGrid。 Expander 显示DataGrid 中数据的类别名称,并有一个隐藏或显示DataGrid 的按钮。通常,我们会完整显示所有 DataGrid,但如果用户觉得方便的话,他可以隐藏一些 DataGrid。

在下面的屏幕截图中,我们看到 StackPanel 中有两个这样的项目:饮料和蔬菜,下面是 ListView 中的相同项目。

StackPanel 工作正常水平:DataGrid 列使用星号作为列宽,可以很好地适应屏幕宽度。但是,垂直,如果我们展开上面的扩展器,那么它会展开超过下一个项目,覆盖蔬菜,并使它们不可见。

ListView 结果相反:水平它存在星号不被遵守的问题,出现一个新的、空的第三列,占据了太多的宽度,以至于两个实际的列都变窄了。我们需要那个星号,因为给列固定宽度不是一个选项,因为屏幕可以调整更小和更大。而且垂直,它按照应有的方式工作,并且比 StackPanel 更好。

以下是在 StackPanel 或 ListView 中使用的 UserControl 代码的基本部分:

<UserControl x:Class="Project1.Views.ExpanderDatagrid" ... >
    <Expander Name="MyExpander" 
        IsExpanded="True" 
        Expanded="MyExpander_Expanded" 
        Collapsed="MyExpander_Collapsed">
        <StackPanel Name="MyPanel">
            <DataGrid Name="MyDataGrid"
                    HorizontalAlignment="Stretch"
                    AutoGenerateColumns="False"
                    ColumnWidth="*"
                    Height="300">
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="MyColumnLeft" Header="Name" Binding="..." />
                    <DataGridTextColumn x:Name="MyColumnRight" Header="Value" Binding="..." />
                </DataGrid.Columns>
            </DataGrid>
        </StackPanel>
    </Expander>
</UserControl>

上面的 UserControl 在代码隐藏中连接到此 XAML 中的 StackPanel 和 ListView:

<StackPanel Name="MyPanelForListOfDatagrids" 
    Height="200" 
    HorizontalAlignment="Stretch" 
    Background="Green">
</StackPanel>
<ListView Name="TheListView">
</ListView>

是的,我确实在 Expander 的 Expanded 和 Collapsed 事件中设置了 MyExpander.Height,但这并没有将下一个控件向下推以防止重叠。

所以我的问题是关于 ListView 和 StackPanel 之间的真正区别,因为两者都可以显示一组项目,但每个都有不同的问题,以及如何将 StackPanel 的正确 horizontal 行为与 StackPanel 的正确 vertical 行为结合起来列表视图。或者我应该尝试其他控制?

listview wpf-controls stackpanel expander app.xaml
1个回答
0
投票

我的部分问题是设置 StackPanel 的

Height
。删除后,StackPanel 的工作方式与预期一样:展开时的 Expander 不再覆盖其他内容。

这并不能解决 ListView 问题及其 DataGrid 内容中的额外列,但现在我可以用 StackPanel 替换项目中的 ListView。

© www.soinside.com 2019 - 2024. All rights reserved.