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

C# WPF DataGrid行高无法超控件高度,描述列内容被截断

问题:WPF DataGrid中Description列多行内容无法滚动,被截断

在Visual Studio开发的C# WPF项目中,用DataGrid展示SQL数据库数据时,Description列可能包含大量多行内容,当前该列会直接截断内容而非显示可用滚动条,即使内容有多行,也会被DataGrid的最大高度限制截断。

尝试过给CellTemplate加ScrollViewer,但只显示灰色不可用的滚动条,没达到预期效果(截图里的两个Description列就是因为做了这个尝试)。

现有XAML代码:

<DataGrid  VerticalAlignment="Top"  MaxHeight="225" Height="225" SelectionUnit="FullRow" MouseDoubleClick="Loaditem" AutoGenerateColumns="False" IsReadOnly="True" x:Name="grid" Margin="7,510,33,0"  >
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Description" Width="100">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.CanContentScroll="True">
                    <TextBlock 
                        Text="{Binding Description}" 
                        HorizontalAlignment="Stretch"
                        VerticalAlignment="Stretch"
                        TextWrapping="Wrap"
                        Height="10000"
                        MinHeight="10000"
                        MaxHeight="10000"
                        />
                    </ScrollViewer>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
    
    
    <DataGrid.CommandBindings>
            <CommandBinding Command="Copy" Executed="CopyCommand" />
        </DataGrid.CommandBindings>

        <!-- 处理CTRL + C复制 -->
        <DataGrid.InputBindings>
            <KeyBinding Key="C" Modifiers="Control" Command="Copy" />
        </DataGrid.InputBindings>
        <DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Copy" Command="Copy" />
            </ContextMenu>
        </DataGrid.ContextMenu>
</DataGrid>

现有后台添加列代码:

grid.Columns.Add(new DataGridTextColumn() { Header = "QTY", Width = new DataGridLength(0.025, DataGridLengthUnitType.Star), Binding = new System.Windows.Data.Binding("Qty") });

grid.Columns.Add(new DataGridTextColumn() { Header = "Description", Width = new DataGridLength(0.49, DataGridLengthUnitType.Star), Binding = new System.Windows.Data.Binding("Description") });
grid.Columns.Add(new DataGridTextColumn() { Header = "Part Number", Width = new DataGridLength(0.1, DataGridLengthUnitType.Star), Binding = new System.Windows.Data.Binding("PartNo")  });
grid.Columns.Add(new DataGridTextColumn() { Header = "Cost", Width = new DataGridLength(0.085, DataGridLengthUnitType.Star), Binding = new System.Windows.Data.Binding("Cost") { StringFormat = "$0.00" } });

问题原因

  1. DataGrid默认行高固定,即便Cell内加了ScrollViewer,行高没放开的话,ScrollViewer会被挤压,无法触发滚动逻辑
  2. 给TextBlock设置了固定的10000高度,强行撑大控件但DataGrid行不允许变高,导致ScrollViewer无法正确计算可滚动区域
  3. 同时通过XAML和后台添加了两个Description列,属于重复设置

解决办法

1. 移除重复列

删掉后台代码中添加的DataGridTextColumn类型的Description列,只保留XAML里带ScrollViewer的版本。

2. 调整DataGrid行高设置

给DataGrid添加RowHeight="Auto"让行高自动适配内容,同时设置MaxRowHeight限制单行最大高度,避免单个行过高影响整体布局。

3. 修正ScrollViewer和TextBlock布局

移除TextBlock的固定高度设置,给ScrollViewer指定最大高度,当内容超过该高度时自动激活滚动条。


修改后的XAML代码

<DataGrid VerticalAlignment="Top" MaxHeight="225" Height="225" 
          SelectionUnit="FullRow" MouseDoubleClick="Loaditem" 
          AutoGenerateColumns="False" IsReadOnly="True" 
          x:Name="grid" Margin="7,510,33,0"
          RowHeight="Auto" MaxRowHeight="150"> <!-- 新增行高自适应和最大行高限制 -->
    <DataGrid.Columns>
        <!-- 保留带ScrollViewer的Description列,调整宽度为星号布局 -->
        <DataGridTemplateColumn Header="Description" Width="0.49*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ScrollViewer VerticalScrollBarVisibility="Auto" 
                                  CanContentScroll="True"
                                  MaxHeight="140"> <!-- 设置ScrollViewer最大高度 -->
                        <TextBlock Text="{Binding Description}" 
                                   HorizontalAlignment="Stretch"
                                   TextWrapping="Wrap" /> <!-- 移除固定高度设置 -->
                    </ScrollViewer>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <!-- 其他列直接在XAML添加,避免后台重复设置 -->
        <DataGridTextColumn Header="QTY" Width="0.025*" Binding="{Binding Qty}" />
        <DataGridTextColumn Header="Part Number" Width="0.1*" Binding="{Binding PartNo}" />
        <DataGridTextColumn Header="Cost" Width="0.085*" Binding="{Binding Cost, StringFormat=$0.00}" />
    </DataGrid.Columns>

    <DataGrid.CommandBindings>
        <CommandBinding Command="Copy" Executed="CopyCommand" />
    </DataGrid.CommandBindings>

    <DataGrid.InputBindings>
        <KeyBinding Key="C" Modifiers="Control" Command="Copy" />
    </DataGrid.InputBindings>
    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Copy" Command="Copy" />
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>

修改后的后台代码

grid.Columns.Add(new DataGridTextColumn() { Header = "QTY", Width = new DataGridLength(0.025, DataGridLengthUnitType.Star), Binding = new System.Windows.Data.Binding("Qty") });
// 移除重复的Description列添加代码
grid.Columns.Add(new DataGridTextColumn() { Header = "Part Number", Width = new DataGridLength(0.1, DataGridLengthUnitType.Star), Binding = new System.Windows.Data.Binding("PartNo")  });
grid.Columns.Add(new DataGridTextColumn() { Header = "Cost", Width = new DataGridLength(0.085, DataGridLengthUnitType.Star), Binding = new System.Windows.Data.Binding("Cost") { StringFormat = "$0.00" } });

内容的提问来源于stack exchange,提问作者Brent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:05:56