Л
Я тоже борюсь с этой проблемой. Существует решение, но оно не очень хорошо работает в Windows XP. Хитрость заключается в том, чтобы зарезервировать место для вашей DataGrid, создав пустую строку-заполнитель. Переместите вашу DataGrid за пределы сетки макета и установите поля, как показано ниже.
<Grid SizeChanged="Grid_SizeChanged">
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Name="DetailGridRow" Height="*" />
<RowDefinition Height="40" />
</Grid.RowDefinitions>
<Button Grid.Row="0" Width="80" Content="Do Something" Margin="5" />
<Button Grid.Row="2" Width="80" Content="Do Something Else" Margin="5" />
</Grid>
<DataGrid Margin="0,40,0,40" Name="dgGrid" AutoGenerateColumns="True" />
Теперь поместите этот обработчик SizeChanged - ваш код позади класса.
/// <summary>
/// In order to prevent the datagrid from growing vertically the size is set to an empty
/// Grid row's size.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
Grid layoutGrid = sender as Grid;
double marginWidth = (layoutGrid.Margin.Left + layoutGrid.Margin.Right);
double marginHeight = (layoutGrid.Margin.Top + layoutGrid.Margin.Bottom);
double minHeight = dgGrid.MinHeight;
if (e.HeightChanged)
dgGrid.Height = DetailGridRow.ActualHeight > minHeight ?
DetailGridRow.ActualHeight - marginHeight : minHeight - marginHeight;
if (e.WidthChanged)
dgGrid.Width = layoutGrid.ActualWidth - marginWidth;
e.Handled = false;
}
Как я упоминал ранее, у этой техники есть проблемы в Windows XP. Проблема, с которой я сталкиваюсь, заключается в том, что все ширины столбцов перепутаны, что приводит к тому, что сетка становится непригодной для использования, пока вы не найдете «магический» столбец и дважды не щелкните его разделитель столбцов, который восстановит все значения ширины столбцов до их правильного размера. Я все еще работаю над решением этой проблемы.