将DataGrid列标题对齐到中心

41

我需要将 WPF DataGrid Column Header 的文本对齐到中心。我创建了一个样式,并使用以下方式附加了它,使用 HeaderStyle 属性。

样式

<Window.Resources>
    <Style x:Key="CenterGridHeaderStyle" TargetType="DataGridColumnHeader">
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
    </Style>
</Window.Resources>

栏目

<DataGridTextColumn 
   Binding="{Binding Path=Name}" Header="Name" IsReadOnly="True" 
   HeaderStyle="{DynamicResource CenterGridHeaderStyle}"/>

但是这并不能让列标题文本居中。我该怎么办?


你可以在以下网址找到答案:https://dev59.com/q2sz5IYBdhLWcg3wYGkz - Tamás Kerék
试试这样做:https://dev59.com/q2sz5IYBdhLWcg3wYGkz - Tamás Kerék
6个回答

83

请检查这个

<DataGridTextColumn Header="Nombre"
                          Binding="{Binding Nombre}">
<DataGridTextColumn.HeaderStyle>
  <Style TargetType="DataGridColumnHeader">
     <Setter Property="HorizontalContentAlignment"
                 Value="Center" />
  </Style>
</DataGridTextColumn.HeaderStyle>

3
请问您能否评论一下为什么您的解决方案有效,而@Bishan的解决方案无效?感激不尽。 - Tatranskymedved
2
我认为我们可以高兴地得知,在WPF中,并不是所有类型都需要通过样式和绑定来添加每一个属性。这真是一项繁琐的工作... - marsh-wiggle

20

在该列中应使用StaticResource而不是DynamicResource:

样式

<Window.Resources>
    <Style x:Key="CenterGridHeaderStyle" TargetType="DataGridColumnHeader">
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
    </Style>
</Window.Resources>

专栏

<DataGridTextColumn 
   Binding="{Binding Path=Name}" Header="Name" IsReadOnly="True" 
   HeaderStyle="{StaticResource CenterGridHeaderStyle}"/>

4
在我看来,这是实际上正确的答案。被接受的答案提供了一种替代方案,但并没有解释为什么问题中提供的代码是错误的。 - DMX David Cardinal
使用此DataGridColumnHeader样式隐式地(即无需x:Key)还可以将所有列标题设置为居中,而不管它们的类型(文本、复选框、组合框、列模板)。 - undefined

2
在AutoGeneratingColumn中,有一个程序化执行的响应。
 private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
                e.Column.HeaderStyle = new Style(typeof(DataGridColumnHeader));
                e.Column.HeaderStyle.Setters.Add(new Setter(HorizontalContentAlignmentProperty, HorizontalAlignment.Center));

    }

提示:使用属性:

public class ColumnNameAttribute : Attribute
{
    public HorizontalAlignment Alignment { get; set;}
    public ColumnNameAttribute(HorizontalAlignment alignment){
        Alignment = alignment;
}

public class Example(){
    [ColumnName(HorizontalAlignment.Center)]
    public string Column {get; set;}
}

 private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
   var desc = e.PropertyDescriptor as PropertyDescriptor;
   var att = desc.Attributes[typeof(ColumnNameAttribute)] as ColumnNameAttribute;
   if(att != null){
           e.Column.HeaderStyle = new Style(typeof(DataGridColumnHeader));
           e.Column.HeaderStyle.Setters.Add(new Setter(HorizontalContentAlignmentProperty, att.Alignment));
    }

}

0

试试这个

<DataGridTextColumn.CellStyle>
  <Style>
    <Setter Property="HorizontalAlignment" Value="Center" />
  </Style>
</DataGridTextColumn.CellStyle>

0
我在搜索“行标题”对齐问题时来到了这里。如果有其他人也在寻找答案,那么解决方案就是非常简单的:
<DataGrid.RowHeaderStyle>
  <Style TargetType="DataGridRowHeader">
    <Style.Resources>
      <Style TargetType="StackPanel">
        <Setter Property="HorizontalAlignment" Value="Center" />
      </Style>
    </Style.Resources>
  </Style>
</DataGrid.RowHeaderStyle>

问题是关于更改单个列。 - Chris Bordeman
@ChrisBordeman:样式可以被键入以将它们应用于特定的范围。 - dotNET
当然,但是你应该展示那个而不是这个。 - Chris Bordeman

0

这是我正在使用的来改变标题文本对齐方式的方法。

<DataGrid.Columns>
    <DataGridTemplateColumn Width="Auto" MinWidth="60" Header=" ID " IsReadOnly="True">                                                                <DataGridTemplateColumn.HeaderStyle>
     <Style TargetType="DataGridColumnHeader">
         <Setter Property="HorizontalContentAlignment" Value="Center"/>
         <Setter Property="Background"  Value="#c0c0c0"/>
         <Setter Property="BorderThickness" Value="1"/>
         <Setter Property="FontWeight" Value="Bold"/>
         <Setter Property="FontSize" Value="12"/>
     </Style>                                                        </DataGridTemplateColumn.HeaderStyle>                                                        <DataGridTemplateColumn.CellTemplate>
     <DataTemplate>
        <TextBlock Text="{Binding ID}" TextAlignment="Center" />
     </DataTemplate>                                                       </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接