2010-10-20 31 views
44

Ho un DataGrid regolare da RTF WPF 4.0, dove inserisco i dati da un database. Per rendere pulito lo stile leggero di DataGrid, io uso righe alte/alte e, per impostazione predefinita, DataGrid allinea il contenuto della riga nella posizione verticale superiore, ma voglio impostare un allineamento verticale centrale.Allineamento verticale del contenuto della riga DataGrid

Ho già provato a utilizzare questa proprietà

VerticalAlignment="Center" 

nelle opzioni di DataGrid, ma non mi aiuta.

Ecco un esempio di XAML-code, che descrive il mio DataGrid senza centro allineamento verticale:

<DataGrid x:Name="ContentDataGrid" 
    Style="{StaticResource ContentDataGrid}" 
    ItemsSource="{Binding}" 
    RowEditEnding="ContentDataGrid_RowEditEnding"> 
<DataGrid.Columns> 
    <DataGridTextColumn Header="UserID" 
      Width="100" 
      IsReadOnly="True" 
      Binding="{Binding Path=userID}" /> 
    <DataGridTextColumn Header="UserName" 
      Width="100" 
      Binding="{Binding Path=userName}" /> 
    <DataGridTextColumn Header="UserAccessLevel" 
      Width="100" 
      Binding="{Binding Path=userAccessLevel}" /> 
    <DataGridTextColumn Header="UserPassword" 
      Width="*" 
      Binding="{Binding Path=userPassword}" /> 
</DataGrid.Columns> 
</DataGrid> 

Risultato di esecuzione di questo codice:

alt text

Come si può vedere il contenuto tutto di fila ha allineamento verticale superiore.

Cosa devo aggiungere per ottenere l'allineamento verticale centrale di ogni contenuto di riga?

Grazie.

+0

Anot il suo approccio, usando l'ereditarietà di DataGridColumn: http://blog.smoura.com/wpf-toolkit-datagrid-part-iii-playing-with-datagridcolumns-and-datagridcells/ - permette di impostare semplicemente la proprietà VerticalAlignment sulla colonna ereditata - richiede ereditando da ogni tipo di colonna usato, quindi è piuttosto una limitazione. Forse qualcuno lo tradurrà in comportamento? – surfen

risposta

85

Soluzione completa di questo problema:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8c2aa3b1-d967-41ab-93c2-6c8cb1b7d29d/#488d0cdd-d0c2-469a-bfb6-8ca3d75426d4

In breve, in set stile-file:

<!--body content datagrid cell vertical centering--> 
<Style x:Key="Body_Content_DataGrid_Centering" 
     TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Grid Background="{TemplateBinding Background}"> 
        <ContentPresenter VerticalAlignment="Center" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Nella finestra file:

<DataGrid x:Name="ContentDataGrid" 
     Style="{StaticResource ContentDataGrid}" 
     CellStyle="{StaticResource Body_Content_DataGrid_Centering}" 
     ItemsSource="{Binding}" 
     RowEditEnding="ContentDataGrid_RowEditEnding"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="UserID" 
       Width="100" 
       IsReadOnly="True" 
       Binding="{Binding Path=userID}" /> 
     <DataGridTextColumn Header="UserName" 
       Width="100" 
       Binding="{Binding Path=userName}" /> 
     <DataGridTextColumn Header="UserAccessLevel" 
       Width="100" 
       Binding="{Binding Path=userAccessLevel}" /> 
     <DataGridTextColumn Header="UserPassword" 
       Width="*" 
       Binding="{Binding Path=userPassword}" /> 
    </DataGrid.Columns> 
</DataGrid> 

Questo vi darà un risultato desiderato:

alt text

+20

so che questa è una vecchia risposta. Ma non è molto lavoro per un semplice centraggio dei contenuti? – neebz

+1

Sfortunatamente, non ho trovato alcuna altra soluzione semplice, se ne hai, per favore, condividi le tue conoscenze. –

+0

Il motivo principale è perché DataGrid contiene DataGridRow che contiene DataGridCell che containt Controls. Vuoi che questi controlli siano al centro verticale. Questo è ciò che sta facendo Toucki. –

5

Il valore dell'attributo VerticalAlignment="Center" centrerà il DataGrid all'interno dell'elemento principale.

Probabilmente si desidera VerticalContentAlignment.

40

Per impostare singoli allineamenti di testo è possibile utilizzare:

<DataGridTextColumn.ElementStyle> 
    <Style TargetType="TextBlock"> 
     <Setter Property="TextAlignment" Value="Center" /> 
    </Style> 
</DataGridTextColumn.ElementStyle> 
+9

Sì, funziona (Usa VerticalAlignment, poiché TextAlignment è per il posizionamento orizzontale del testo), ma tu Dovremo impostare gli stili degli elementi per tutte le colonne (le colonne di caselle di controllo e le colonne combo dovranno avere stili diversi). – surfen

+0

È così, perché non interrompe le linee della griglia se ne hai quelle abilitate. –

+0

Come posso centrare il testo durante la modifica? – Erik

16

Il seguente codice in verticale allineare il contenuto di una cella DataGridTextColumn:

<DataGridTextColumn.ElementStyle> 
    <Style TargetType="TextBlock"> 
     <Setter Property="VerticalAlignment" Value="Center"></Setter> 
    </Style> 
</DataGridTextColumn.ElementStyle> 

Edit: ho torna a questo problema e trova la soluzione seguente per funzionare meglio, centrerà il contenuto di tutte le celle in DataGridTextRows sia orizzontalmente che verticalmente.

<UserControl.Resources>  
    <ResourceDictionary> 
     <Style TargetType="DataGridCell"> 
      <Setter Property="HorizontalAlignment" Value="Stretch"></Setter> 
      <Setter Property="VerticalAlignment" Value="Stretch"></Setter> 
      <Setter Property="VerticalContentAlignment" Value="Stretch"></Setter> 
      <Setter Property="TextBlock.TextAlignment" Value="Center"></Setter> 
      <Setter Property="TextBlock.VerticalAlignment" Value="Center"></Setter> 
     </Style>  
    </ResourceDictionary> 
</UserControl.Resources> 
+1

NON funziona. Prova a impostare DataGrid RowHeight = 100 per rendere le righe più alte dell'altezza predefinita. le linee della griglia saranno totalmente strane. La tua prima soluzione (DataGridTextColumn.ElementStyle) funziona meglio per me. – joedotnot

12

Si potrebbe anche fare a meno override del ControlTemplate:

<Style TargetType="{x:Type DataGridCell}"> 
    <Setter Property="VerticalAlignment" Value="Center" /> 
    </Style> 
+1

Non so perché questa risposta non ha avuto voti. È molto più semplice delle risposte più complesse e funziona perfettamente! –

+4

Questa risposta funziona solo quando non ci sono linee di griglia verticali. In caso contrario, le griglie otterranno una lacuna se si imposta la proprietà RowHeight. – Sven

1

Sulla risposta di Jamier, il seguente codice ha fatto il trucco per me quando si utilizzano le colonne generate automaticamente:

Style VerticalCenterStyle = new Style(); 

public MainWindow() 
{ 
    // This call is required by the designer. 
    InitializeComponent(); 

    VerticalCenterStyle.Setters.Add(new Setter(VerticalAlignmentProperty, VerticalAlignment.Center)); 
} 

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if (e.Column is DataGridTextColumn) { 
    ((DataGridTextColumn)e.Column).ElementStyle = VerticalCenterStyle; 
    } 
} 
6

Questo funziona per me

<DataGrid.CellStyle> 
    <Style TargetType="DataGridCell">    
    <Setter Property="TextBlock.TextAlignment" Value="Center"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type DataGridCell}"> 
      <Grid Background="{TemplateBinding Background}"> 
      <ContentPresenter VerticalAlignment="Center"/> 
      </Grid> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
</DataGrid.CellStyle> 
Problemi correlati