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" } });
问题原因
- DataGrid默认行高固定,即便Cell内加了ScrollViewer,行高没放开的话,ScrollViewer会被挤压,无法触发滚动逻辑
- 给TextBlock设置了固定的10000高度,强行撑大控件但DataGrid行不允许变高,导致ScrollViewer无法正确计算可滚动区域
- 同时通过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
相关产品推荐
相关产品推荐

