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
样式应用于文本列。
首先定义一个 Style
以 TextBlock
为目标并启用文本换行:
<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;
}
}
我正在开发 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
样式应用于文本列。
首先定义一个 Style
以 TextBlock
为目标并启用文本换行:
<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;
}
}