在 wpf 中,我如何使数据网格适合窗口高度
Posted
技术标签:
【中文标题】在 wpf 中,我如何使数据网格适合窗口高度【英文标题】:in wpf how do i make a datagrid fit the window height 【发布时间】:2011-10-04 10:13:17 【问题描述】:我有一个 3 列 2 行的网格
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
在左下角的单元格中,我有一个数据网格,AutoGenerateColumns=True 可以加载许多行。我想要做的是最大化数据网格高度以适应窗口,并让用户能够使用数据网格滚动条上下滚动行。
发生的情况是窗口底部的数据网格流动,即使我设置了
ScrollViewer.VerticalScrollBarVisibility="Visible"
在数据网格中,滚动条不起作用,行向下流动。不知何故,数据网格并没有受到限制......
怎么办?
【问题讨论】:
给数据网格一些宽度可能会解决你的问题......如果你不想硬编码宽度,你可以做一些元素绑定来实现这个...... 我担心身高。 . . 对不起..我说的只是高度..这是一个错字...给数据网格一些高度可能会解决您的问题...如果您不想硬编码高度,您可以做某种元素绑定来实现这一点.. 【参考方案1】:尝试设置您的 DataGrid 的 HorizontalAlignment=Stretch
和 VerticalScrollBarVisibility=Auto
如果这不起作用,您可能还需要将 Grid 的 Height 绑定到 Window Height,以便它不会自动增长以适应其内容。通常我使用Height="Binding RelativeSource=RelativeSource AncestorType=x:Type Window, Path=ActualHeight"
(可能是RenderSize.ActualHeight
而不仅仅是ActualHeight
...我忘了。
另一种选择是使用DockPanel
而不是Grid
,因为该控件不会自动增长以适应其内容。相反,它会拉伸它的最后一个孩子来填充剩余的空间。
【讨论】:
有趣的想法。我会试一试并报告:-) 装订技术非常有效,谢谢!正如您所写,它是 ActualPath。顺便说一句,我如何将某些东西绑定到路径值的一小部分? Path=ActualPath/2 似乎不起作用。 @Gilshalit 您需要为此使用转换器【参考方案2】:我遇到了同样的问题,但绑定到窗口高度并没有完全解决我的问题。在我的例子中,DataGrid 仍然在 Window 的可视区域下方延伸 2 到 3 英寸。我相信这是因为我的 DataGrid 开始于 Window 顶部下方约 2 到 3 英寸处。
最后我发现根本不需要绑定DataGrid的高度。我所要做的就是更改 DataGrid 的直接容器。
对我来说,当添加足够多的行时,以下 XAML 设置会导致 DataGrid 超出窗口的大小。请注意,DataGrid 位于 StackPanel 中。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="75"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<!-- StackPanel Content accounting for about 2-3 inches of space -->
</StackPanel>
<!-- DataGrid within a StackPanel extends past the vertical space of the Window
and does not display vertical scroll bars. Even if I bind the height to Window
height the DataGrid content still extends 2-3 inches past the viewable Window area-->
<StackPanel Grid.Row="1">
<DataGrid ItemsSource="StaticResource ImportedTransactionList"
Margin="10,20,10,10" MinHeight="100">
</DataGrid>
</StackPanel>
</Grid>
但是,只需删除 StackPanel 即可解决我的问题。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="75"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<!-- StackPanel Content accounting for about 2-3 inches of space -->
</StackPanel>
<!-- Removing the StackPanel fixes the issue-->
<DataGrid Grid.Row="1" ItemsSource="StaticResource SomeStaticResource"
Margin="10,20,10,10" MinHeight="100">
</DataGrid>
</Grid>
由于原始帖子很旧,我应该注意我使用的是 VS2017 和 .Net Framework 4.6.1,但我不确定这是否有任何影响。
【讨论】:
我尝试在 Visual Studio 2019 Enterprise 中像上面那样在数据网格中添加 stackpanel,它给了我错误:“属性元素不能位于元素内容的中间。它们必须在之前或之后内容。”【参考方案3】:您必须使用*
定义DataGrid 所在的列和行。
你说它在左下角的单元格上。该行还可以,但您的列有Width="Auto"
。
如果Width="Auto"
,AutoGenerateColumns=True
就会一团糟。
【讨论】:
注意,这会导致水平滚动条不显示,即使你设置了ScrollViewer.HorizontalScrollBarVisibility="Auto"
以上是关于在 wpf 中,我如何使数据网格适合窗口高度的主要内容,如果未能解决你的问题,请参考以下文章