Comment aligner les données de colonne sur le centre d'une variable WPF DataGrid
?
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>
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>
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}"
+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>
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
};
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;
}
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.
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>
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 !
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>
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
});