DataGrid行内容垂直alignment
我有一个从WPF 4.0 RTM的常规DataGrid,我从数据库中放置数据。 为了使DataGrid的干净和清淡的风格我使用高/高的行,默认情况下,DataGrid排列行垂直位置的内容,但我想设置一个中心垂直alignment。
我已经尝试使用这个属性
VerticalAlignment="Center"
在DataGrid选项中,但它不能帮助我。
这里是一个XAML代码的例子,描述我的DataGrid没有中心垂直alignment:
<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>
执行此代码的结果:
正如你所看到的,所有行的内容都有顶部垂直alignment。
为了获得每行内容的中心垂直alignment,我必须添加什么?
谢谢。
这个问题的完整解决scheme:
简而言之,在样式文件集中:
<!--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>
这会给你一个想要的结果:
要设置单独的文本alignment,您可以使用:
<DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="TextAlignment" Value="Center" /> </Style> </DataGridTextColumn.ElementStyle>
以下代码将垂直alignmentDataGridTextColumn单元格的内容:
<DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="VerticalAlignment" Value="Center"></Setter> </Style> </DataGridTextColumn.ElementStyle>
编辑:我已经回到这个问题,发现下面的解决scheme更好地工作,它将在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>
您也可以不覆盖ControlTemplate:
<Style TargetType="{x:Type DataGridCell}"> <Setter Property="VerticalAlignment" Value="Center" /> </Style>
属性值VerticalAlignment="Center"
将使DataGrid在其父元素中间。
您可能需要VerticalContentAlignment 。
这个为我工作
<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>
在Jamier的答案的基础上,下面的代码在使用自动生成的列时对我有用:
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; } }