Да, я тоже с этим сталкивался, должно быть, ошибка.Проблема на самом деле не в самом переносе, а в том, что как только ячейка станет меньше, чем она была, то высота DataGrid не будет обновляться до тех пор, пока не будет изменен размер по какой-либо причине (изменить размер окна или что-то еще).У меня нет хорошего решения этой проблемы, но вот какой-то обходной путь.
Обновление
Оптимизированная версия с использованием DataGridColumn вместо TextBlocks.Использует вложенное свойство WrapColumn (по умолчанию false), чтобы знать столбцы, которые переносятся.
Xaml.Добавьте local: MainWindow.WrapColumn = "True" для каждого столбца переноса.
<DataGridTemplateColumn Header="Health"
local:MainWindow.WrapColumn="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock TextTrimming="CharacterEllipsis"
TextWrapping="Wrap"
Text="{Binding Path=Health}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Добавьте вложенное свойство
public partial class MainWindow : Window
{
private static readonly DependencyProperty WrapColumnProperty =
DependencyProperty.RegisterAttached("WrapColumn",
typeof(bool),
typeof(MainWindow));
public static void SetWrapColumn(DependencyObject element, bool value)
{
element.SetValue(WrapColumnProperty, value);
}
public static bool GetWrapColumn(DependencyObject element)
{
return (bool)element.GetValue(WrapColumnProperty);
}
Добавьте прослушиватель изменений ActualWidth для каждого DataGridColumn, для которого установлен WrapColumnк истине
public MainWindow()
{
InitializeComponent();
DependencyPropertyDescriptor dependencyPropertyDescriptor =
DependencyPropertyDescriptor.FromProperty(DataGridColumn.ActualWidthProperty, typeof(DataGridColumn));
if (dependencyPropertyDescriptor != null)
{
foreach (DataGridColumn column in c_dataGrid.Columns)
{
if (GetWrapColumn(column) == true)
{
dependencyPropertyDescriptor.AddValueChanged(column, DataGridColumn_ActualWidthChanged);
}
}
}
void DataGridColumn_ActualWidthChanged(object sender, EventArgs e)
{
c_dataGrid.Width = c_dataGrid.ActualWidth - 1;
EventHandler eventHandler = null;
eventHandler = new EventHandler(delegate
{
c_dataGrid.Width = double.NaN;
c_dataGrid.LayoutUpdated -= eventHandler;
});
c_dataGrid.LayoutUpdated += eventHandler;
}
//...
}