You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);
});

问题效果

DataGrid列宽过窄,内容被挤压


解决方法

  1. 启用列宽自适应或星号分配
    你注释掉的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;
    
  2. 修复容器布局约束

    • 把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;
      
  3. 调整外层ScrollViewer设置
    外层ScrollViewer的水平滚动会让内部容器优先使用最小宽度,可将HorizontalScrollBarVisibility改为Disabled,强制内部容器填充宽度:

    <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
    

    若必须保留水平滚动,需确保TabControl、TabItem内容都设置HorizontalAlignment="Stretch",同时给DataGrid设置明确的最小宽度或星号列宽。

  4. 手动设置列宽(关闭自动生成列时)
    因为你关闭了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:13:23