【发布时间】: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。