DataGrid周围的WPF ScrollViewer会影响列宽

Jay*_*Jay 13 wpf xaml scrollviewer wpfdatagrid

我有一个ScrollViewer的问题,我用它来滚动包含数据网格的用户控件.如果没有滚动查看器,列会根据需要填充数据网格,但在添加滚动查看器时,列会缩小到~15px.我能够简化我的布局,仍然可以重现这种行为.

将数据网格宽度绑定到另一个控件时,列具有它们的法线,但这与数据网格上的固定宽度具有相同的效果.我想我不是第一个遇到这个问题的人.如何解决此问题,让我的网格将其大小调整为可用空间并为其列提供一个比例宽度?

使用scrollviewer: 在此输入图像描述 没有: 在此输入图像描述

<Window x:Class="GridTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<ScrollViewer HorizontalScrollBarVisibility="Auto">
<Grid MinWidth="200">
    <DataGrid Margin="0" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Header="Column A" Width="*"/>
            <DataGridCheckBoxColumn Header="Column B" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

sa_*_*213 18

是的,我前一段时间遇到过这个问题,我采取了一种解决方法,我将在这里发布,只是因为它有用

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <Grid x:Name="grid" MinWidth="200">
        <DataGrid Width="{Binding ElementName=grid, Path=ActualWidth}">
            <DataGrid.Columns>
                <DataGridCheckBoxColumn Header="Column A" Width="1*"/>
                <DataGridCheckBoxColumn Header="Column B" Width="1*"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

诀窍是给出DataGrid一个宽度,在这种情况下,我绑定回包含元素

或者,如果您不使用HorizontalScrollBar它,您可以禁用它,这将允许ScrollViewer计算宽度,允许DataGrid计算宽度.

  • 调整窗口宽度时网格会调整大小,但仅在宽度增加时调整。知道如何在窗口宽度减小时调整网格大小吗? (2认同)
  • @mardok我通过使用RelativeSource绑定绑定到`ScrollContentPresenter`的ActualWidth来解决您的问题。 (2认同)
  • 如前所述,它仅在宽度增加时才起作用。我可以使用它的方法是在@BradleyUffner的帮助下:`&lt;Grid x:Name =“ grid” MinWidth =“ 400” Width =“ {Binding Path = ActualWidth,RelativeSource = {RelativeSource FindAncestor,AncestorType = {x :Type ScrollContentPresenter}}}“&gt; &lt;DataGrid&gt; &lt;DataGrid.Columns&gt; &lt;DataGridTextColumn Header =” Test“ Width =” *“&gt; &lt;/ DataGridTextColumn&gt; &lt;DataGridTextColumn Header =” Test2“ Width =” *“&gt; &lt;/ DataGridTextColumn&gt; &lt;Da​​taGridTextColumn Header =“ Test3” Width =“ *”&gt; &lt;/ DataGridTextColumn&gt; &lt;/DataGrid.Columns&gt; &lt;/ DataGrid&gt; &lt;/ Grid&gt;` (2认同)

Ish*_*awa 5

我上周经历了同样的事情。

通常,当您具有以下元素时会出现此问题:

  1. DataGrid具有未定义宽度的A放在 a 内ScrollViewer,其HorizontalScrollBarVisibility属性设置为Auto
  2. 至少一个DataGridColumn具有无限/未定义宽度(例如:Width="*"


实际上,解决方案取决于您的需求:

  • 您希望在 Window 显示时DataGridColumns占用所有可用空间DataGrid(即使没有显示数据):在这种情况下,sa_ddam213的答案可以帮助您应对。
  • 或者您不介意DataGrid在 Window 的第一场演出的最后一列和右边框之间留有一些空白。

对于最后一个选项,您只需要为您的DataGridColumns(或者如果您不想就不要定义它,这不是很重要,因为用户可以通过双击轻松调整列的大小) . 在这种情况下,您DataGrid可以在没有宽度的情况下进行定义。


这是一个例子:

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <Grid x:Name="grid" MinWidth="200">
        <DataGrid>
            <DataGrid.Columns>
                <DataGridCheckBoxColumn Header="Column A" Width="100"/>
                <DataGridCheckBoxColumn Header="Column B" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)


这样,如果在列自动调整大小后列内容在容器上运行,则会出现水平滚动条。