WPF数据表格列宽自动调整和滚动条

17
我有一个包含许多列的数据表格。
如果窗口比所有列都更狭窄,我希望使用 Width="Auto" 并显示滚动条来展示所有内容。如果窗口较宽,我希望列能够跨越空白区域,以便没有死区。
基本上,我希望列的最小宽度能够完全适应内容或标题。如果窗口更宽,则可以扩展到更大的尺寸。

你能发布一下你目前的 XAML 代码吗? - d.moncada
如果将宽度设置为auto,则滚动条永远不会出现。 - Eduardo Brites
@EduardoBrites修改了问题以增加更多的澄清。 - Brent
2
好的。你看到这个答案了吗?https://dev59.com/qXA75IYBdhLWcg3wPmZ8#4011435 - Eduardo Brites
@EduardoBrites,实际上我刚刚发现了这个问题,花了一个多小时的时间查找,之前一无所获。如果这样解决了,我会删除这个问题。 - Brent
@EduardoBrites 的回答有所帮助,但我还是花了一段时间才弄明白。因此,我会将我的答案代码发布为这个问题的答案。 - Brent
2个回答

28
在WPF中,如果您想像您指定的那样“填充”DataGrid的所有水平空间,请确保您在XAML中设置了以下属性:
<DataGrid 
   HorizontalAlignment="Stretch" 
   HorizontalContentAlignment="Stretch" 
   ColumnWidth="*" />

5
此解决方案可避免在网格宽度不足以容纳所有列的内容时出现水平滚动条。 - dlf

13

在XAML中设置DataGrid的ColumnWidth="Auto"

在UserControl构造函数中添加

dataGrid.Loaded += (s, e) => { // Column widths
    dataGrid.Columns.AsParallel().ForEach(column => {
        column.MinWidth = column.ActualWidth;
        column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
    });
};

将其与自定义 DataGrid 一起使用,效果很好。


1
-1 无法使用标准的WPF和.NET 4.5编译;如果没有提供代码,仅说它可以与自定义Datagrid一起使用并没有太大用处。 - user585968
9
通常涉及GUI元素时,使用"AsParallel()"是个大忌。 - user585968
2
@Brent AsParallel().ForEach() 将使用线程池。关于DataGrid线程安全性,如果我可以引用MSDN的话:_"任何实例成员都不能保证是线程安全的"_ http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.aspx - user585968
1
@MickyDuncan,你说得对,这可能不是线程安全的,但在这种情况下执行的操作是可以的,因为我们知道在执行此代码时,我们是唯一更改这些设置的人。 - Darren
1
它说ForEach不能用于datagrid。 - Incisor
显示剩余3条评论

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