Вертикальное выравнивание содержимого строки DataGrid - PullRequest
50 голосов
/ 20 октября 2010

У меня есть обычная DataGrid из WPF 4.0 RTM, куда я помещаю данные из базы данных.Чтобы сделать чистый и светлый стиль DataGrid, я использую высокие / высокие строки и по умолчанию DataGrid выравнивает содержимое строки в верхнем вертикальном положении, но я хочу установить вертикальное выравнивание по центру.

IЯ уже пытался использовать это свойство

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

Как видно, все содержимое строки имеет верхнее вертикальное выравнивание.

Что мне нужно добавить, чтобы получить выравнивание по центру каждого содержимого строки?

Ответы [ 7 ]

100 голосов
/ 22 октября 2010

Полное решение этой проблемы в 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

47 голосов
/ 05 декабря 2011

Чтобы установить отдельные выравнивания текста, вы можете использовать:

<DataGridTextColumn.ElementStyle>
   <Style TargetType="TextBlock">
       <Setter Property="TextAlignment" Value="Center" />
   </Style>
</DataGridTextColumn.ElementStyle>
19 голосов
/ 09 октября 2013

Следующий код будет выравнивать содержимое ячейки 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>
12 голосов
/ 11 февраля 2014

Вы также можете обойтись без переопределения шаблона ControlTemplate:

    <Style TargetType="{x:Type DataGridCell}">
    <Setter Property="VerticalAlignment" Value="Center" />
    </Style>
10 голосов
/ 15 августа 2016

Этот работает для меня

 <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>
5 голосов
/ 20 октября 2010

Значение атрибута VerticalAlignment="Center" будет центрировать DataGrid в его родительском элементе.

Вы, вероятно, хотите VerticalContentAlignment .

1 голос
/ 27 марта 2016

Опираясь на ответ Джамье, следующий код помог мне при использовании автоматически сгенерированных столбцов:

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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...