2009-04-06 24 views
44

Come allineare i dati della colonna al centro in un WPF DataGrid?Allineamento del testo in un WPF DataGrid

+1

per Silverlight, vedere [questa risposta] (http://stackoverflow.com/questions/7916226/column-aligment-in-a-silverlight-datagrid/7916301#7916301). –

risposta

40

E 'difficile da dire senza conoscere le specifiche, ma ecco un DataGridTextColumn che è centrato:

<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> 
+0

Ha funzionato alla grande anche per me nel dicembre 2010! – ErocM

+6

Questo approccio non ha funzionato per me. Il testo era centrato, ma la larghezza della cella non corrispondeva più alla sua intestazione. La soluzione di Mohammed ha funzionato meglio. –

+1

Come ha detto Kiff, anche la cella si sta spostando. Devi scegliere come target il Textblock come l'esempio di Mohammed A. Fadil. –

1

Ok, ho usato l'approccio FrameworkElement ma c'era uno strano comportamento quando si tenta di evidenziare la riga.

Ho messo un altro esempio di allineamento Datagrid WPF in questo thread!

74

Se si utilizza DataGridTextColumn è possibile utilizzare il seguente frammento di codice:

<Style TargetType="DataGridCell"> 
    <Style.Setters> 
      <Setter Property="TextBlock.TextAlignment" Value="Center" /> 
    </Style.Setters> 
</Style> 
+5

Questo è il modo migliore: impostare l'allineamento sulla cella fa sì che la cella non riempia la sua larghezza, che appare strana quando viene selezionata la riga – bruceboughton

+1

Inizialmente questo non ha funzionato per me, ma dopo un po 'di test e correzione di alcuni errori nel mio codice questa soluzione ha funzionato alla grande. Grazie! – BrianVPS

+0

@BrianVPS mi fa piacere, sono lieto di sapere che: D –

12

+1 per Kent Boogaart. ho finito per fare questo, il che rende il codice un po 'meno ingombrante (e mi permette di utilizzare l'allineamento su più colonne):

<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> 
+0

+1 per lo stile, ma per me "HorizontalAlignment" non funziona, mentre "HorizontalContentAlignment" lo fa. – Emmanuel

0

La mia soluzione preferita è:

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

4

O nel codice sottostante:

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; 
} 
14

Ho iniziato con la soluzione di huttelihut. Sfortunatamente, non ha funzionato ancora per me. Ho ottimizzato la sua risposta e si avvicinò con questa (soluzione è quella di allineare il testo a destra):

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

Come potete vedere, ho applicato lo stile a un TextBlock, non il DataGridCell.

E poi ho dovuto impostare l'elemento stile , non il cellulare stile.

ElementStyle="{StaticResource RightAligned}" 
+1

Si noti che questo non funziona con 'DataGridTextColumn' –

+0

@JP Hellemons: per me ha funzionato con' DataGridTextColumn' – Mikhail

2

Alla fine ho avuto problemi con la cella spostata e sembrando funky usando la risposta accettata. So che è tardi, ma spero che le mie scoperte possano aiutare qualcuno. Io uso:

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

piuttosto che il CellStyle.

7

Ecco @ risposta XAML di MohammedAFadil, convertito in C# codice dietro:

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

Per applicare la Style, impostare la proprietà CellStyle del DataGrid, per esempio

var MyGrid = new DataGrid() { 
    CellStyle = MyStyle 
}; 
+1

Semplice e pulito! +1 :) Proprio quello di cui avevo bisogno. –

0

Grazie Danny Beckett per la conversione della risposta XAML di @ MohammedAFadil, convertita in codice C#. Tutti i miei datagrids sono configurati in modo dinamico, quindi posso cambiare qualsiasi cosa, ogni volta.

Per impostare un datagrid vuoto, con niente in esso e quindi legarlo ai dati, basta prendere il tuo datagrid.colonne

 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 
     });