DataGrid 使用 AutoGenerateColumns=true 启用列的文本换行

DataGrid enable text wrapping of columns with AutoGenerateColumns=true

我正在开发 WPF MVVM 应用程序。我有一个 DataGrid,它绑定到一个 DataTable。 AutoGenerateColumns 设置为真。

但是,如果需要,我想将列的文本换行到 2 或 3 行。目前,当我滚动 DataGrid 时,当第一列的文本较长时,第一列会根据需要扩展,最后一列不再显示或被剪切。

代码如下:

<Grid.Resources>
    <Style x:Key="ColumnHeaderStyle" TargetType="DataGridColumnHeader">
         <Setter Property="ItemsControl.MinHeight" Value="50" />
         <Setter Property="ItemsControl.MinWidth" Value="60" />
         <Setter Property="ItemsControl.HorizontalContentAlignment" Value="Center" />
         <Setter Property="ItemsControl.VerticalContentAlignment" Value="Center" />
    </Style>
</Grid.Resources>

网格:

<Grid
    Width="800"
    Height="500"
    Visibility="Visible">
    <Grid.Resources>
        //code
    </Grid.Resources>
    <DataGrid
        Name="Map"
        Width="Auto"
        Height="Auto"
        Margin="0,10,0,0"
        AutoGenerateColumns="True"
        AutoGeneratingColumn="Map_AutoGeneratingColumn"
        CanUserAddRows="False"
        CanUserReorderColumns="False"
        CanUserResizeColumns="True"
        CanUserResizeRows="True"
        CanUserSortColumns="False"
        ColumnHeaderStyle="{StaticResource ColumnHeaderStyle}"
        FontStretch="Normal"
        IsReadOnly="True"
        ItemsSource="{Binding MapDataTable}" />

我省略了与问题无关的内容。

这是我尝试过的:

尝试 1:

<Grid.Resources>
    <Style x:Key="ColumnHeaderStyle" TargetType="DataGridColumnHeader">
         <Setter Property="ItemsControl.MinHeight" Value="50" />
         <Setter Property="ItemsControl.MinWidth" Value="60" />
         <Setter Property="ItemsControl.HorizontalContentAlignment" Value="Center" />
         <Setter Property="ItemsControl.VerticalContentAlignment" Value="Center" />
         <Setter Property="ContentTemplate">
               <Setter.Value>
                    <DataTemplate>
                         <TextBlock TextWrapping="Wrap" />
                    </DataTemplate>
               </Setter.Value>
         </Setter>
    </Style>
</Grid.Resources>

尝试 2:

<Grid.Resources>
    <Style x:Key="ColumnHeaderStyle" TargetType="DataGridColumnHeader">
         <Setter Property="ItemsControl.MinHeight" Value="50" />
         <Setter Property="ItemsControl.MinWidth" Value="60" />
         <Setter Property="ItemsControl.HorizontalContentAlignment" Value="Center" />
         <Setter Property="ItemsControl.VerticalContentAlignment" Value="Center" />
    </Style>
    <Style TargetType="TextBlock">
         <Setter Property="TextWrapping" Value="Wrap" />
    </Style>
</Grid.Resources>

两者都不行。修复文本换行的正确方法是什么? AutoGenerateColumns 必须为真。

如您所知,修改列 header 不会修改列。解决办法是监听DataGrid.AutoGeneratingColumn事件,有选择地修改生成的列。

我看到您已经在收听 AutoGeneratingColumn 活动。您只需修改事件处理程序即可将 TextBlock 样式应用于文本列。

首先定义一个 StyleTextBlock 为目标并启用文本换行:

<DataGrid AutoGeneratingColumn="Map_AutoGeneratingColumn">
  <DataGrid.Resources>
    <Style TargetType="TextBlock">
      <Setter Property="TextWrapping" Value="Wrap" />
    </Style>
  </DataGrid.Resources>
</DataGrid>

然后转到 AutogeneratingColumn 事件处理程序 Map_AutoGeneratingColumn 并过滤文本列以设置其初始宽度并应用先前定义的 TextBlock 样式:

private void Map_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
  var dataGrid = sender as DataGrid;
  if (e.Column is DataGridTextColumn textColumn)
  {
    textColumn.ElementStyle = dataGrid.FindResource(typeof(TextBlock)) as Style;
    e.Column.Width = 100;
  }
}