web-dev-qa-db-fra.com

Alignement du texte dans un WPF DataGrid

Comment aligner les données de colonne sur le centre d'une variable WPF DataGrid?

49
Prashant C

Il est difficile de dire sans connaître les détails, mais voici une DataGridTextColumn centrée:

<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>
43
Kent Boogaart

Si vous utilisez DataGridTextColumn, vous pouvez utiliser le fragment de code suivant:

<Style TargetType="DataGridCell">
     <Style.Setters>
            <Setter Property="TextBlock.TextAlignment" Value="Center" />
     </Style.Setters>
</Style>
87
Mohammed A. Fadil

J'ai commencé avec la solution de huttelihut. Malheureusement, cela n'a pas encore fonctionné pour moi. J'ai modifié sa réponse et proposé ceci (la solution consiste à aligner le texte à droite):

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

Comme vous pouvez le constater, j'ai appliqué le style à un TextBlock, pas à DataGridCell.

Et puis je devais définir le style élément , pas le style cellule .

ElementStyle="{StaticResource RightAligned}"
19
Jan

+1 pour Kent Boogaart . J'ai fini par le faire, ce qui rend le code un peu moins encombré (et me permet d'utiliser l'alignement sur plusieurs colonnes):

<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>
14
T.J.Kjaer

Voici la réponse XAML de @ MohammedAFadil, convertie en code C # derrière:

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

Pour appliquer Style, définissez la propriété CellStyle de DataGrid, par exemple.

var MyGrid = new DataGrid() {
    CellStyle = MyStyle
};
9
Danny Beckett

Ou dans le code derrière: 

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;
}
4
Hans

J'ai fini par avoir des problèmes avec la cellule déplacée et semblant géniale en utilisant la réponse acceptée. Je sais qu'il est tard, mais j'espère que mes découvertes aideront quelqu'un. J'utilise:

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

plutôt que le CellStyle. 

3
Rachael

Ma solution préférée est:

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

1
Web Developer

D'accord, j'ai utilisé l'approche frameworkElement, mais il y avait un comportement étrange lorsque vous essayez de mettre en évidence la ligne. 

J'ai mis un autre exemple d'alignement WPF Datagrid dans ce thread !

1
Junior M

Pour moi celui-ci fonctionne bien

<DataGridTextColumn Width="1*" Binding="{Binding Balance, StringFormat=C} "Header="Balance">
  <DataGridTextColumn.CellStyle>
      <Style>
        <Setter Property="TextBlock.TextAlignment"  Value="Right"/>
      </Style>
   </DataGridTextColumn.CellStyle>
 </DataGridTextColumn>
0
Bruno Henn

Merci Danny Beckett pour avoir converti la réponse XAML de @ MohammedAFadil, convertie en code C #. Toutes mes datagrids sont configurées de manière dynamique, je peux donc changer n'importe quoi, à tout moment. 

Pour configurer une grille de données vide, ne contenant rien et la lier simplement à des données, prenez simplement votre 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
        });
0
Stephen Himes