如何获得一个 WPF 数据网格,其中包含环绕文本而不是截断文本的单元格?

Posted

技术标签:

【中文标题】如何获得一个 WPF 数据网格,其中包含环绕文本而不是截断文本的单元格?【英文标题】:How get a WPF Datagrid with cells that wrap text instead of truncating it? 【发布时间】:2011-06-07 23:52:51 【问题描述】:

必须做些什么才能获得一个 WPF DataGrid,其中的单元格会换行而不是截断文本?

现在,当文本较大且不适合列时,文本会被截断,用户无法看到它的值,因为 DataGrid 的 IsReadOnly 属性为 true。我想要的是单元格中的文本被包装并且单元格高度(NO CELL WIDTH)增加了显示所有文本所需的数量。

【问题讨论】:

【参考方案1】:

感谢@H.B. 的帮助,这对我有用(对齐是可选的):

<DataGrid.Columns>               
    <DataGridTextColumn Header="Wrapped & centered" Binding="Binding field">
        <DataGridTextColumn.ElementStyle>
             <Style>                            
                 <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
                 <Setter Property="TextBlock.TextAlignment" Value="Center"/>
             </Style>
         </DataGridTextColumn.ElementStyle>
    </DataGridTextColumn>
</DataGrid.Columns>

【讨论】:

对于其他人:如果此解决方案不适合您,请尝试调整列宽。它会在开始换行之前尝试扩展列宽。 用什么方式调整宽度?我在这里尝试了代码,但它在 Visual Studio 的 WPF 设计器中似乎没有什么不同。 在 DataGridTextColumn 上设置 Width 属性,如: 您可以使用Width="*" 将其设置为填满整个空间,但不能超过容器允许的大小。 感谢@Anthony Nichols,因为没有设置 Width="*" 它不起作用。此外设置 TextBlock.TextAlignment 是不必要的。问候。【参考方案2】:

我做了一些类似于 D.Rosados 的解决方案。但是,如果您有更多需要包装的列,我的可以重复使用。

<UserControl.Resources>
    <Style TargetType="x:Type TextBlock" x:Key="WrapText">
        <Setter Property="TextWrapping" Value="Wrap"/>
    </Style>
</UserControl.Resources>

<DataGrid.Columns>
    <DataGridTextColumn IsReadOnly="False" Header="Address" 
     Binding="Binding Address" ElementStyle="StaticResource WrapText" Width="150"/>
</DataGrid.Columns>

【讨论】:

【参考方案3】:

您可以尝试使用启用了文本换行的TextBlock 对单元格进行模板化。

【讨论】:

非常感谢。已经解决了样式问题。我的意思是,将 DataGridTextColumn 的 ElementStyle 属性设置为具有诸如“”之类的设置器的东西。在我看来,最好将控件的样式更改为自定义控件而不是重写其模板的一种方式。无论如何,我愿意接受建议,因为我是 WPF 的新手。我的问题是我只是不能应用样式 ala TargetType 因为似乎在某种程度上 TextBlock 具有指定的样式来覆盖应用的 ala TargetType 样式。再次感谢。 为此使用样式是个好主意,不要认为有更好的解决方案(至少对于这种特定情况) 问题是使用模板列时,您会失去复制文本等基本功能。我目前正面临这个问题,将改用样式。【参考方案4】:

为 Editing 和 Text DataGrid 列设置文本换行的另一种简单方法是指定 Binding 属性和 TextWrapping 属性,如下所示:

<DataGridTemplateColumn x:Name="ColumnName" Header="Column Header Goes Here">
        <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                         <TextBox Text="Binding Path=DataBoundProperty, Mode=TwoWay" TextWrapping="Wrap"/>
                </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
        <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="Binding Path=DataBoundProperty, Mode=OneWay" TextWrapping="Wrap"/>
            </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

【讨论】:

【参考方案5】:

这是另外一个解决方案

<DataGridTemplateColumn Header="MyFieldName" Width="150" >
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <TextBlock Text="Binding MyField"  TextWrapping="Wrap">
        <TextBlock.ToolTip>
          <TextBlock Text="Binding MyField"  />
        </TextBlock.ToolTip>
      </TextBlock>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

【讨论】:

以上是关于如何获得一个 WPF 数据网格,其中包含环绕文本而不是截断文本的单元格?的主要内容,如果未能解决你的问题,请参考以下文章

WPF C#,如何将数据从数据网格添加到数据库

在 WPF 中,如何将数据网格列绑定到数据表的特定列?

冻结wpf数据网格中的列

如何通过代码生成 WPF 控件

将数据加载到数据网格时 C#/WPF 主窗口冻结

获取一个文本框以填充 WPF 中的网格单元格