如何使XAML DataGridColumns填满整个DataGrid?

143

我正在使用XAML中的DataGrid(不是Silverlight),并且具有可调整大小的列,如果用户调整屏幕大小,则DataGrid将扩展。

目前,如果所有DataGrid列的宽度小于DataGrid的宽度,则会出现一个额外的“列”,该列无法单击,并且没有任何作用。

有没有人知道如何使一列始终调整大小以填充所有剩余空间?

12个回答

289
如果使用 Width="*" ,该列将填充以扩展可用空间。
如果您希望所有列平均分配网格,请将其应用于所有列。如果您只想要一个列填充剩余空间,只需将其应用于该列,其他列则为 "Auto" 或特定宽度。
您还可以使用 Width="0.25*" (例如)如果您希望该列占用可用宽度的 1/4。

3
如果我使用 AutoGenerateColumns="True",如何做类似的事情? - Oleg Vazhnev
2
@javapowered - 我建议您提出自己的问题,并引用此问题。 - ChrisF
25
@DataGrid AutoGenerateColumns="True" ColumnWidth="*" ItemsSource={Binding} />这段代码是一个WPF(Windows Presentation Foundation)中的DataGrid控件,它会自动生成所有列并将宽度设置为相等。数据源由绑定提供,具体细节需要根据上下文来确定。 - Xavier
13
@MohamedSakherSawan,它确实适用于数据网格。在_DataGrid_上设置ColumnWidth="*"或在各个列上设置Width="*"都会产生预期效果。 - Steve
1
无法将错误字符串转换为“*”。 - 0x12
显示剩余4条评论

21

确保您的DataGrid已将 Width 设置为类似于 {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}

这样,您在DataGrid.Columns/DataGridXXXXColumn元素上设置Width="*"属性应该可以正常工作。


15

正如注释所述,对于XAML中的DataGrid来说,ColumnWidth="*"效果非常好。

我在这个上下文中使用了它:

<DataGrid ColumnWidth="*" ItemsSource="{Binding AllFolders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

8

我个人意见 ->

很晚才加入

DataGrid -> Column -> Width="*" 只有在 DataGrid 父容器有固定宽度时才起作用。

例如:我把 DataGrid 放在 Grid -> Column 中,其中 Grid -> Column 的宽度为 "Auto",那么在 DataGrid 中设置 Width="*" 就无效了。但是如果你将 Grid -> Column 的宽度设置为 "450" 即固定值,则它就可以正常工作。


7

将列的Width属性设置为比例宽度,例如*


3
另一个关于相同主题的解释:

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
    dataGrid.Width = e.NewSize.Width - (e.NewSize.Width * .1);

    foreach (var column in dataGrid.Columns)
    {
       column.Width = dataGrid.Width / dataGrid.Columns.Count;
    }
 }

2

我添加了一个HorizontalAlignment="Center"属性(默认值为"Stretch"),这解决了我的问题,因为它使得数据表格的宽度只有所需的宽度。(如果您设置了宽度,请删除数据表格的宽度设置。)

enter image description here


1
结合所选答案和这个答案,问题得到了解决。我需要在Datagrid本身上删除宽度。谢谢。 - Bryan Harrington
在我的情况下,被接受的答案还不够。在添加了您提到的 HorizontalAlignment="Center" 之后,问题得到了解决。谢谢! - Stan1k

1
如果设置了AutoGeneratedColumns="True",那么这将不会扩展XAML网格的最后一列以填充剩余空间。

我已经移除了AutoGenerateColumns,即使列没有被分割或拉伸到整个数据网格/屏幕的宽度。我将网格的相应行设置为“*”,并且列的宽度没有指定任何宽度(无论是“auto”还是“some value”)。但是我仍然遇到问题,这是我的设计的xaml代码http://pastie.org/10085815。 - G K

0

对于那些寻找 C# 解决方案的人:

如果您由于某种原因需要启用 "AutoGeneratedColumns",可以做的一件事是指定除了要自动调整大小的列之外的所有列的宽度(它不会占用剩余空间,但它会根据单元格的内容进行调整)。

例如(dgShopppingCart 是我的 DataGrid):

dgShoppingCart.Columns[0].Visibility = Visibility.Hidden; 
dgShoppingCart.Columns[1].Header = "Qty";
dgShoppingCart.Columns[1].Width = 100;
dgShoppingCart.Columns[2].Header = "Product Name"; /*This will be resized to cell content*/
dgShoppingCart.Columns[3].Header = "Price";
dgShoppingCart.Columns[3].Width = 100;
dgShoppingCart.Columns[4].Visibility = Visibility.Hidden; 

对我来说,这是一个解决方法,因为我需要在用户最大化窗口时调整DataGrid的大小。


0

这对我很有效,只需将columnwidth依赖属性设置为columnwidth="*"它将填充列宽度到datagrid宽度,就像winforms(autosize=fill)一样。

 <DataGrid Grid.Row="0" x:Name="dg1" VerticalAlignment="Top" AutoGenerateColumns="False" Margin="0,0,-6,0" Width="1520" Height="700"  CanUserAddRows="True" 
        
        CanUserDeleteRows="True" ItemsSource="{Binding EmployeeData}" RowDetailsVisibilityMode="Visible" HorizontalGridLinesBrush="DarkBlue" VerticalGridLinesBrush="DarkGreen" ColumnWidth="*" >

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接