58

如何将列数据对齐到 WPF 中的中心DataGrid

4

13 回答 13

105

如果您使用的是 DataGridTextColumn,则可以使用以下代码片段:

<Style TargetType="DataGridCell">
     <Style.Setters>
            <Setter Property="TextBlock.TextAlignment" Value="Center" />
     </Style.Setters>
</Style>
于 2010-04-28T12:39:44.277 回答
50

不知道细节很难说,但这里有一个DataGridTextColumn集中的:

<wpf:DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True">
    <wpf:DataGridTextColumn.CellStyle>
        <Style>
            <Setter Property="FrameworkElement.HorizontalAlignment" Value="Center"/>
        </Style>
    </wpf:DataGridTextColumn.CellStyle>
</wpf:DataGridTextColumn>
于 2009-04-06T09:45:48.473 回答
22

我从 huttelihut 的解决方案开始。不幸的是,这对我来说还没有用。我调整了他的答案并想出了这个(解决方案是将文本向右对齐):

<Resources>
    <Style x:Key="RightAligned" TargetType="TextBlock">
        <Setter Property="HorizontalAlignment" Value="Right"/>
    </Style>
</Resources>

如您所见,我将样式应用于 TextBlock,而不是 DataGridCell。

然后我必须设置元素样式,而不是单元格样式。

ElementStyle="{StaticResource RightAligned}"
于 2013-05-09T10:17:09.587 回答
15

肯特·布加特 +1。我最终这样做了,这使代码稍微不那么混乱(并使我能够在几列上使用对齐方式):

<Resources>
      <Style x:Key="NameCellStyle" TargetType="DataGridCell">
                <Setter Property="HorizontalAlignment" Value="Center" />
      </Style>
</Resources>


<DataGrid.Columns>                           
   <DataGridTextColumn Header="Name" CellStyle="{StaticResource NameCellStyle}" Binding="{Binding Name}"/>                            
    // .. other columns        
</DataGrid.Columns>
于 2011-03-28T07:54:32.447 回答
9

这是@MohammedAFadil 的 XAML 答案,后面转换为 C# 代码:

var MyStyle = new Style(typeof(DataGridCell)) {
    Setters = {
        new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Center)
    }
};

要应用Style,请设置 的CellStyle属性DataGrid,例如

var MyGrid = new DataGrid() {
    CellStyle = MyStyle
};
于 2014-08-26T14:04:06.703 回答
4

或者在后面的代码中:

grid.CellStyle = newCellStyle();

public static Style newCellStyle()
{
    //And here is the C# code to achieve the above
    System.Windows.Style style = new Style(typeof(DataGridCell));
    style.Setters.Add(new System.Windows.Setter
    {
        Property = Control.HorizontalAlignmentProperty,
        Value = HorizontalAlignment.Center
    });
    return style;
}
于 2012-08-23T12:31:04.730 回答
3

我最终遇到了单元格被移动并且使用公认的答案看起来很时髦的问题。我知道已经很晚了,但希望我的发现对某人有所帮助。我用:

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

而不是 CellStyle。

于 2013-07-03T15:12:38.507 回答
1

好的,我使用了 frameworkElement 方法,但是当您尝试突出显示该行时出现了一个奇怪的行为。

我在这个线程中放了另一个 WPF Datagrid 对齐的例子!

于 2009-08-24T19:50:54.573 回答
1

我最喜欢的解决方案是:

<DataGridTextColumn Header="My Column" Binding="{Binding MyDBValue}" Width="100" >
<DataGridTextColumn.CellStyle>
        <Style>
                <Setter Property="FrameworkElement.HorizontalAlignment" Value="Center"/>
        </Style>
</DataGridTextColumn.CellStyle>

于 2011-07-09T15:06:40.257 回答
1

对我来说,这个效果很好

<DataGridTextColumn Width="1*" Binding="{Binding Balance, StringFormat=C} "Header="Balance">
  <DataGridTextColumn.CellStyle>
      <Style>
        <Setter Property="TextBlock.TextAlignment"  Value="Right"/>
      </Style>
   </DataGridTextColumn.CellStyle>
 </DataGridTextColumn>
于 2019-04-02T20:19:43.673 回答
1

如果有人仍在寻找答案,这对我有用:

<DataGridTextColumn ...>
    <DataGridTextColumn.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <Grid Background="{TemplateBinding Background}">
                            <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Left"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGridTextColumn.CellStyle>
</DataGridTextColumn>
于 2020-12-10T15:19:24.580 回答
0

感谢 Danny Beckett 将 @MohammedAFadil 的 XAML 答案转换为 C# 代码。我所有的数据网格都是动态设置的,所以我可以随时更改任何内容。

要设置一个空的数据网格,其中没有任何内容,然后将其绑定到数据,只需获取您的 datagrid.columns

        var centerTextSetter = new Style(typeof(DataGridCell))
        {
            Setters = { new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Center) }
        };
        DgDbNames.Columns.Add(new DataGridTextColumn()
        {
            Header = "Db Name",
            Binding = new System.Windows.Data.Binding("DbName"),
            IsReadOnly = true,
            Width = new DataGridLength(0.2, DataGridLengthUnitType.Star),
            CellStyle = centerTextSetter
        });
于 2017-10-18T20:07:33.840 回答
0

我真的很喜欢 Bruno 的 TextBlock.TextAlignment 方法。您可以将此与水平对齐结合使用,然后任何背景都将延伸到整个网格单元格。

例如(在 VB 中)

    Dim sty = New System.Windows.Style(GetType(DataGridCell))
    sty.Setters.Add(New Setter(HorizontalAlignmentProperty, HorizontalAlignment.Stretch))
    sty.Setters.Add(New Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right))
    sty.Setters.Add(New Setter(BackgroundProperty, Brushes.LightGray))
于 2020-08-28T11:13:26.930 回答