在 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=StretchVerticalScrollBarVisibility=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 中,我如何使数据网格适合窗口高度的主要内容,如果未能解决你的问题,请参考以下文章

如何使wpf数据网格填充所有可用空间并使用窗口调整大小?

随着窗口大小的变化,如何在wpf中动态测量网格宽度/高度

如何使窗口高度适应内容?

如何在 WPF 数据网格中显示 N 个项目?

如何重新加载 WPF 网格

如何在 WPF 数据网格上自动滚动