在文本块列中使用自动换行时数据网格高度太高

Posted

技术标签:

【中文标题】在文本块列中使用自动换行时数据网格高度太高【英文标题】:Data grid height is too tall when using word-wrap in text block column 【发布时间】:2012-06-07 02:56:51 【问题描述】:

我希望用一列表示相当长的文本值来制作数据网格。所以我的目标功能是:

列宽与剩余窗口空间一样宽(窗口可以调整大小) 必要时自动换行 将数据网格高度限制为窗口的剩余高度,并根据需要提供垂直滚动

以下代码符合前两项并提供了一个正常工作的垂直滚动条,但数据网格高度对于它所显示的内容来说太高了。从文本块中删除自动换行可以解决这个问题……但我需要自动换行。

如何保持自动换行功能而不会使数据网格高度过高?

<ScrollViewer VerticalScrollBarVisibility="Auto">
   <Grid>
      <Grid.ColumnDefinitions>
         <ColumnDefinition Width="Auto" />
         <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
         <RowDefinition Height="Auto" />
         <RowDefinition Height="Auto" />
      </Grid.RowDefinitions>
      <!-- other controls in different parts of the data grid -->
      <DataGrid Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left"
         Margin="0,6,6,6" Name="dgMessages" VerticalAlignment="Top" 
         Background="DarkGray" HeadersVisibility="None"
         AlternatingRowBackground="Gainsboro" CanUserResizeColumns="False"
         CanUserResizeRows="False" CanUserSortColumns="False" 
         AutoGenerateColumns="false" BorderBrush="Black" HorizontalGridLinesBrush="x:Null"
         ItemsSource="Binding Messages, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged" >
             <DataGrid.Columns>
                 <dg:DataGridTemplateColumn Width="*">
                     <dg:DataGridTemplateColumn.CellTemplate>
                         <DataTemplate>
                             <TextBlock Text="Binding Value" 
                                TextWrapping="WrapWithOverflow" 
                                Padding="5,5,5,5" />
                         </DataTemplate>
                     </dg:DataGridTemplateColumn.CellTemplate>
                 </dg:DataGridTemplateColumn>
             </DataGrid.Columns>
         </DataGrid>
     </Grid>
 </ScrollViewer>

“dg”命名空间是“http://schemas.microsoft.com/winfx/2006/xaml/presentation”

【问题讨论】:

在浏览器中做一个查看源代码并将代码粘贴到这里,这样我们就可以查看生成的html了。 我不认为我可以这样做,因为这是一个 WPF 桌面项目,所以没有使用浏览器。无论如何,我环顾四周以确定并没有找到任何生成的 HTML。我误会你了吗? 【参考方案1】:

移除滚动查看器并将包含数据网格的行的高度设置为“*”修复了此问题。当数据网格不在根据内容自动调整大小的行中时,通常会处理在数据网格列中换行的文本。

这里是结束代码:

<Grid>
   <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition Width="*"/>
   </Grid.ColumnDefinitions>
   <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition Height="*" />
   </Grid.RowDefinitions>
   <!-- other controls in different parts of the data grid -->
   <DataGrid Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left"
      Margin="0,6,6,6" Name="dgMessages" VerticalAlignment="Top" 
      Background="DarkGray" HeadersVisibility="None"
      AlternatingRowBackground="Gainsboro" CanUserResizeColumns="False"
      CanUserResizeRows="False" CanUserSortColumns="False" 
      AutoGenerateColumns="false" BorderBrush="Black" HorizontalGridLinesBrush="x:Null"
      ItemsSource="Binding Messages, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged" >
      <DataGrid.Columns>
         <dg:DataGridTemplateColumn Width="*">
            <dg:DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                  <TextBlock Text="Binding Value" TextWrapping="WrapWithOverflow" Padding="5,5,5,5" />
               </DataTemplate>
            </dg:DataGridTemplateColumn.CellTemplate>
         </dg:DataGridTemplateColumn>
      </DataGrid.Columns>
   </DataGrid>
</Grid>

【讨论】:

以上是关于在文本块列中使用自动换行时数据网格高度太高的主要内容,如果未能解决你的问题,请参考以下文章

隐藏网格列改变行的高度

如何实现 placeholder自动换行

用Vue实现高度自增的文本框

如何让 jqgrid 冻结列与自动换行一起使用

Fabric.js 实现文本自动换行

使用 FPDF 在单元格中自动换行?