【发布时间】:2011-06-29 01:42:47
【问题描述】:
我在 XAML(不是 Silverlight)中使用带有可调整大小列的 DataGrid,如果用户调整屏幕大小,DataGrid 将展开。
目前,如果所有 DataGrid 列的宽度小于 DataGrid 的宽度,我会出现一个额外的“列”,该列不可点击且无用。
有谁知道如何让一列总是调整大小以填充所有剩余空间?
【问题讨论】:
标签: c# wpf xaml datagrid wpf-controls
我在 XAML(不是 Silverlight)中使用带有可调整大小列的 DataGrid,如果用户调整屏幕大小,DataGrid 将展开。
目前,如果所有 DataGrid 列的宽度小于 DataGrid 的宽度,我会出现一个额外的“列”,该列不可点击且无用。
有谁知道如何让一列总是调整大小以填充所有剩余空间?
【问题讨论】:
标签: c# wpf xaml datagrid wpf-controls
如果您使用Width="*",该列将填充以扩大可用空间。
如果您希望所有列均分网格,请将其应用于所有列。如果您只想填充剩余空间,只需将其应用于该列,其余为“自动”或特定宽度。
如果您希望列占据可用宽度的 1/4,也可以使用 Width="0.25*"(例如)。
【讨论】:
AutoGenerateColumns="True",如何做类似的事情?
<DataGrid AutoGenerateColumns="True" ColumnWidth="*" ItemsSource={Binding} />
ColumnWidth="*" 和各个列上的Width="*" 都具有预期的效果
确保您的 DataGrid 已将 Width 设置为 {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}} 之类的内容。
这样,您在DataGrid.Columns/DataGridXXXXColumn 元素上设置的Width="*" 属性应该可以工作。
【讨论】:
如前所述,ColumnWidth="*" 非常适合 XAML 中的 DataGrid。
我在这种情况下使用它:
<DataGrid ColumnWidth="*" ItemsSource="{Binding AllFolders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
【讨论】:
将列Width 属性设置为比例宽度,例如*
【讨论】:
我的 2 美分 ->
聚会很晚
DataGrid -> Column -> Width="*" 仅在 DataGrid 父容器具有固定宽度时才有效。
示例:我将 DataGrid 放在 Grid -> Column 中,其 width="Auto" 然后 Width="*" 在 DataGrid 中不起作用,但如果您设置 Grid -> Column Width="450" 表示固定,那么它工作正常
【讨论】:
同一主题的另一个旋转:
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;
}
}
【讨论】:
我添加了一个 HorizontalAlignment="Center" (默认为“Strech”),它解决了我的问题,因为它使数据网格仅根据需要宽。 (如果有,请删除数据网格的宽度设置。)
【讨论】:
HorizontalAlignment="Center" 后,它解决了这个问题。谢谢!
这不会扩展 xaml 网格的最后一列以占用剩余空间,如果
AutoGeneratedColumns="True".
【讨论】:
将 ONE 列的宽度设置为任意值,即 width="*"
【讨论】:
对于那些寻找 C# 解决方法的人:
如果您出于某种原因需要启用“AutoGeneratedColumns”,您可以做的一件事是指定所有列的宽度,除了您想要自动调整大小的列(它不会占用剩余空间,但它会根据单元格的内容调整大小)。
示例(dgShoppingCart 是我的 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 的大小。
【讨论】:
对我来说效果很好,只需将 columnwidth 依赖属性设置为 columnwidth="*" 它就会像 winforms(autosize=fill) 一样将列宽度填充到数据网格宽度 p>
<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="*" >
【讨论】: