我遇到了显示多个子元素的问题,使用 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 行为结合起来列表视图。或者我应该尝试其他控制?
我的部分问题是设置 StackPanel 的
Height
。删除后,StackPanel 的工作方式与预期一样:展开时的 Expander 不再覆盖其他内容。
这并不能解决 ListView 问题及其 DataGrid 内容中的额外列,但现在我可以用 StackPanel 替换项目中的 ListView。