【问题标题】:DataGrid enable text wrapping of columns with AutoGenerateColumns=trueDataGrid 使用 AutoGenerateColumns=true 启用列的文本换行
【发布时间】:2021-09-29 07:22:58
【问题描述】:

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

但是,如果需要,我想将列的文本换成 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 必须为真。

【问题讨论】:

  • 为什么 AutoGenerateColumns 必须为真?
  • 我在运行时动态地向 DataTable 添加列。
  • 设置 ColumnWidth="*" 没有帮助?
  • 我不这么认为,不。我不能在样式中将它设置为“*”,这不是我打算做的。我希望列单元格是多行的。
  • 请注意,切勿将 DataGrid.Height 设置为 Auto。这将禁用垂直滚动条,因为现在允许无限拉伸 DataGrid。这将禁用 UI 虚拟化,这意味着您的 DataGrid 将立即加载所有项目,而不是仅加载可见项目。这将对性能产生重大影响。此外,您将无法查看所有项目,因为没有允许滚动的 ScrollViewer。

标签: c# wpf datagrid


【解决方案1】:

您已经意识到修改列标题不会修改列。解决方法是监听DataGrid.AutoGeneratingColumn事件,选择性地修改生成的列。

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

首先定义一个以TextBlock为目标的Style并启用文本换行:

<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;
  }
}

【讨论】:

  • 像魅力一样工作,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 2013-11-27
  • 2011-04-29
  • 1970-01-01
  • 2011-07-10
  • 2018-02-01
  • 2015-08-07
相关资源
最近更新 更多