如何在WPF的C#后台代码中设置DataGrid列宽为文本自适应/Auto?
后台创建WPF DataGrid列宽过窄问题
我在后台代码中创建DataGrid并添加到TabItem中(每个TabItem对应一个DataGrid),但始终遇到列宽过窄、数据难以阅读的问题。复制已有XAML中的设置无效,就算直接在XAML里加DataGrid用相同设置,结果还是一样。
XAML用户控件代码
<UserControl> <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> <DockPanel Background="#A0A1A2" Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" LastChildFill="False"> ........... <TabControl> (tabitem will be generated through loop with adding datagrids into the tabitem in code behind) </TabControl> </DockPanel> </ScrollViewer> </UserControl>
后台代码
dt_grid1 = new DataGrid(); dt_grid2 = new DataGrid(); InitializeComponent(); // Setting up the Datagrids: Dispatcher.Invoke(() => { // Datagrid1: dt_grid1.CanUserAddRows = false; dt_grid1.CanUserDeleteRows = false; dt_grid1.CanUserReorderColumns = false; dt_grid1.CanUserResizeColumns = false; dt_grid1.CanUserResizeRows = false; dt_grid1.CanUserSortColumns = false; dt_grid1.AutoGenerateColumns = false; dt_grid1.IsReadOnly = true; dt_grid1.Margin = new Thickness(5); dt_grid1.VerticalAlignment = VerticalAlignment.Stretch; dt_grid1.HorizontalAlignment = HorizontalAlignment.Stretch; dt_grid1.SelectionMode = DataGridSelectionMode.Extended; //dt_grid1.ColumnWidth = new DataGridLength(50, DataGridLengthUnitType.Star); // Datagrid2: dt_grid2.CanUserAddRows = false; dt_grid2.CanUserDeleteRows = false; dt_grid2.CanUserReorderColumns = false; dt_grid2.CanUserResizeColumns = false; dt_grid2.CanUserResizeRows = false; dt_grid2.CanUserSortColumns = false; dt_grid2.AutoGenerateColumns = false; dt_grid2.IsReadOnly = true; dt_grid2.Margin = new Thickness(5); dt_grid2.VerticalAlignment = VerticalAlignment.Stretch; dt_grid2.HorizontalAlignment = HorizontalAlignment.Stretch; dt_grid2.SelectionMode = DataGridSelectionMode.Extended; //dt_grid2.ColumnWidth = new DataGridLength(50, DataGridLengthUnitType.Star); });
问题效果

解决方法
启用列宽自适应或星号分配
你注释掉的ColumnWidth星号设置是关键,星号模式会让列按比例填充可用宽度。取消注释并调整参数:dt_grid1.ColumnWidth = new DataGridLength(1, DataGridLengthUnitType.Star); dt_grid2.ColumnWidth = new DataGridLength(1, DataGridLengthUnitType.Star);也可以用自适应内容模式,让列自动匹配内容宽度:
dt_grid1.ColumnWidth = DataGridLength.Auto;若要兼顾自适应和避免列过宽,可设置最大宽度:
dt_grid1.ColumnWidth = new DataGridLength(0, DataGridLengthUnitType.Auto); dt_grid1.MaxColumnWidth = 200;修复容器布局约束
- 把
DockPanel的LastChildFill改为True,确保TabControl能填充剩余空间:<DockPanel Background="#A0A1A2" Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" LastChildFill="True"> - 后台添加DataGrid到TabItem时,将DataGrid放入可拉伸的容器(如Grid)中:
TabItem tab1 = new TabItem(); Grid tabContent = new Grid(); tabContent.Children.Add(dt_grid1); tab1.Content = tabContent;
- 把
调整外层ScrollViewer设置
外层ScrollViewer的水平滚动会让内部容器优先使用最小宽度,可将HorizontalScrollBarVisibility改为Disabled,强制内部容器填充宽度:<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">若必须保留水平滚动,需确保TabControl、TabItem内容都设置
HorizontalAlignment="Stretch",同时给DataGrid设置明确的最小宽度或星号列宽。手动设置列宽(关闭自动生成列时)
因为你关闭了AutoGenerateColumns,需要给每个手动创建的列单独设置宽度:DataGridTextColumn col = new DataGridTextColumn(); col.Header = "列名"; col.Binding = new Binding("字段名"); col.Width = new DataGridLength(1, DataGridLengthUnitType.Star); dt_grid1.Columns.Add(col);
内容的提问来源于stack exchange,提问作者user23077506
相关产品推荐
相关产品推荐

