You have some options. You can set the DataGrid.ColumnWidth
to a fixed width or to DataGridLength.SizeToHeader
:
For all columns:
<DataGrid ColumnWidth="{x:Static DataGridLength.SizeToHeader}" />
For individual columns:
<DataGridTextColumn Width="{x:Static DataGridLength.SizeToHeader}" />
Additionally you can add an ellipsis character to the cell's content to indicate overflowing cell content to the user.
When auto generating columns:
<DataGrid AutoGeneratingColumn="OnDataGrid_AutoGeneratingColumn"
ColumnWidth="{x:Static DataGridLength.SizeToHeader}">
<DataGrid.Resources>
<Style x:Key="DataGridTextColumnEditStyle"
TargetType="{x:Type TextBlock}"
BasedOn="{StaticResource {x:Type TextBlock}}">
<Setter Property="TextTrimming"
Value="CharacterEllipsis" />
</Style>
</DataGrid.Resources>
</DataGrid>
private void OnDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.Column is DataGridTextColumn textColumn)
{
var dataGrid = sender as DataGrid;
var textColumnEditStyle = dataGrid.FindResource("DataGridTextColumnEditStyle") as Style;
textColumn.ElementStyle = textColumnEditStyle;
}
}
When defining columns explicitly:
<DataGrid AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Width="{x:Static DataGridLength.SizeToHeader}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}"
BasedOn="{StaticResource {x:Type TextBlock}}">
<Setter Property="TextTrimming"
Value="CharacterEllipsis" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
Another solution is to allow the DataGrid
to calculate the widths and validate and coerce each column width afterwards:
<DataGrid Loaded="OnDataGrid_Loaded" />
private const double MaxColumnWidth = 200;
private void OnDataGrid_Loaded(object sender, RoutedEventArgs e)
{
var dataGrid = sender as DataGrid;
// Alternatively, select the particular column of interest by index or Header value
foreach (DataGridColumn column in dataGrid.Columns)
{
if (column.ActualWidth > MaxColumnWidth)
{
column.Width = MaxColumnWidth;
}
}
}