Вертикальное выравнивание содержимого строки DataGrid
У меня есть обычная DataGrid из WPF 4.0 RTM, куда я помещаю данные из базы данных. Чтобы сделать чистый и легкий стиль DataGrid
я использую высокие/высокие строки и по умолчанию DataGrid
выравнивает содержимое строки в верхнем вертикальном положении, но я хочу установить вертикальное выравнивание по центру.
Я уже пытался использовать это свойство
VerticalAlignment="Center"
в опциях DataGrid
, но это мне не помогает.
Вот пример XAML-кода, описывающего мою DataGrid
без вертикального выравнивания по центру:
<DataGrid x:Name="ContentDataGrid"
Style="{StaticResource ContentDataGrid}"
ItemsSource="{Binding}"
RowEditEnding="ContentDataGrid_RowEditEnding">
<DataGrid.Columns>
<DataGridTextColumn Header="UserID"
Width="100"
IsReadOnly="True"
Binding="{Binding Path=userID}" />
<DataGridTextColumn Header="UserName"
Width="100"
Binding="{Binding Path=userName}" />
<DataGridTextColumn Header="UserAccessLevel"
Width="100"
Binding="{Binding Path=userAccessLevel}" />
<DataGridTextColumn Header="UserPassword"
Width="*"
Binding="{Binding Path=userPassword}" />
</DataGrid.Columns>
</DataGrid>
Результат выполнения этого кода:
![alt text]()
Как вы можете видеть, все содержимое строки имеет верхнее вертикальное выравнивание.
Что мне нужно добавить, чтобы получить выравнивание по центру каждого содержимого строки?
Ответы
Ответ 1
Полное решение этой проблемы в MSDN: Вертикальное выравнивание содержимого строки DataGrid.
Вкратце, в наборе стилей файлов:
<!--body content datagrid cell vertical centering-->
<Style x:Key="Body_Content_DataGrid_Centering"
TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
В окне файла:
<DataGrid x:Name="ContentDataGrid"
Style="{StaticResource ContentDataGrid}"
CellStyle="{StaticResource Body_Content_DataGrid_Centering}"
ItemsSource="{Binding}"
RowEditEnding="ContentDataGrid_RowEditEnding">
<DataGrid.Columns>
<DataGridTextColumn Header="UserID"
Width="100"
IsReadOnly="True"
Binding="{Binding Path=userID}" />
<DataGridTextColumn Header="UserName"
Width="100"
Binding="{Binding Path=userName}" />
<DataGridTextColumn Header="UserAccessLevel"
Width="100"
Binding="{Binding Path=userAccessLevel}" />
<DataGridTextColumn Header="UserPassword"
Width="*"
Binding="{Binding Path=userPassword}" />
</DataGrid.Columns>
</DataGrid>
Это даст вам желаемый результат:
![alt text]()
Ответ 2
Чтобы установить отдельные выравнивания текста, вы можете использовать:
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center" />
</Style>
</DataGridTextColumn.ElementStyle>
Ответ 3
Следующий код будет вертикально выровнять содержимое ячейки DataGridTextColumn:
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"></Setter>
</Style>
</DataGridTextColumn.ElementStyle>
Изменить: Я вернулся к этой проблеме и нашел, что решение ниже работает лучше, оно сосредоточит содержимое всех ячеек в DataGridTextRows как по горизонтали, так и по вертикали.
<UserControl.Resources>
<ResourceDictionary>
<Style TargetType="DataGridCell">
<Setter Property="HorizontalAlignment" Value="Stretch"></Setter>
<Setter Property="VerticalAlignment" Value="Stretch"></Setter>
<Setter Property="VerticalContentAlignment" Value="Stretch"></Setter>
<Setter Property="TextBlock.TextAlignment" Value="Center"></Setter>
<Setter Property="TextBlock.VerticalAlignment" Value="Center"></Setter>
</Style>
</ResourceDictionary>
</UserControl.Resources>
Ответ 4
Вы также можете обойтись без переопределения ControlTemplate:
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
Ответ 5
Это работает для меня
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="TextBlock.TextAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
Ответ 6
Значение атрибута VerticalAlignment="Center"
будет центрировать DataGrid в его родительском элементе.
Вы, вероятно, хотите VerticalContentAlignment.
Ответ 7
Основываясь на ответе Джейми, следующий код сделал для меня трюк при использовании автоматически сгенерированных столбцов:
Style VerticalCenterStyle = new Style();
public MainWindow()
{
// This call is required by the designer.
InitializeComponent();
VerticalCenterStyle.Setters.Add(new Setter(VerticalAlignmentProperty, VerticalAlignment.Center));
}
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.Column is DataGridTextColumn) {
((DataGridTextColumn)e.Column).ElementStyle = VerticalCenterStyle;
}
}
Ответ 8
Это мое простое решение, и оно просто отлично работает
<DataGridTemplateColumn Header="Hello" Width="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="World!" TextAlignment="Center" VerticalAlignment="Center"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Я установил ширину 200, чтобы вы могли заметить разницу.