В WPF существует несколько способов заставить столбец в DataGrid не расширяться и переносить значение ячейки на другую строку. Рассмотрим два из них:
1. Использование стиля со свойствами ColumnWidth и ElementStyle.
Сначала установите свойство ColumnWidth для столбца, чтобы оно не принимало значение "Auto":
<DataGrid.Columns> <DataGridTextColumn Header="ColumnHeader" Width="SizeToCells" /> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap" /> <Setter Property="VerticalAlignment" Value="Center" /> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> </DataGrid.Columns>
Действие свойства ColumnWidth значения "SizeToCells" заставляет столбец подстроиться под содержимое ячеек, а свойства TextWrapping и VerticalAlignment применяют перенос текста на другую строку и выравнивание текста по центру соответственно.
2. Использование стиля с многолучевым привязчиком и GridLengthConverter.
Сначала установите свойство ColumnWidth для столбца, чтобы оно не принимало значение "Auto":
<DataGridTextColumn Header="ColumnHeader"> <DataGridTextColumn.CellStyle> <Style TargetType="DataGridCell"> <Setter Property="TextBlock.TextWrapping" Value="Wrap" /> <Setter Property="TextBlock.VerticalAlignment" Value="Center" /> <Setter Property="FrameworkElement.Height"> <Setter.Value> <Binding Path="ActualWidth" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}"> <Binding.Converter> <local:GridLengthConverter /> </Binding.Converter> </Binding> </Setter.Value> </Setter> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn>
В стиле столбца DataGridTextColumn установите CellStyle и задайте свойства TextWrapping и VerticalAlignment для TextBlock для переноса текста и выравнивания по центру. Затем установите свойство Height для FrameworkElement (в данном случае DataGridCell) с использованием привязчика и GridLengthConverter. Привязывайте ActualWidth свойства столбца DataGrid к Height свойства ячейки DataGridCell, чтобы ячейка всегда имела одинаковую высоту, как и ширина столбца.
Поскольку GridLengthConverter не является встроенным конвертером, вы должны создать его собственный класс-конвертер. Вот пример такого класса:
public class GridLengthConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { double width = (double)value; return new GridLength(width, GridUnitType.Pixel); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
Это два примера, как заставить столбец в DataGrid не расширяться и переносить значение ячейки на другую строку в WPF. В зависимости от требований и контекста вашего приложения, вы можете выбрать наиболее подходящий метод.