2010-10-20 5 views
44

J'ai un DataGrid régulier de WPF 4.0 RTM, où je place des données à partir d'une base de données. Afin de rendre propre & style léger de DataGrid j'utilise une haute/haute rangées et par défaut DataGrid aligne le contenu de la ligne dans la position verticale supérieure, mais je veux définir un alignement vertical central.Alignement vertical du contenu de la ligne DataGrid

Je l'ai déjà essayé d'utiliser cette propriété

VerticalAlignment="Center" 

dans les options de DataGrid, mais il ne me permet pas.

Voici un exemple de XAML code, décrivant mon DataGrid sans centre alignement vertical:

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

Résultat d'exécution de ce code:

alt text

Comme vous pouvez le voir le contenu de tous les rangs a l'alignement vertical supérieur.

Que dois-je ajouter pour obtenir l'alignement vertical du centre de chaque contenu de ligne?

Merci.

+0

Anot son approche, en utilisant l'héritage DataGridColumn: http://blog.smoura.com/wpf-toolkit-datagrid-part-iii-playing-with-datagridcolumns-and-datagridcells/ - permet de définir simplement la propriété VerticalAlignment sur la colonne héritée - nécessite héritant de chaque type de colonne utilisé, c'est donc une limitation. Peut-être que quelqu'un va le traduire en comportement? – surfen

Répondre

85

Solution complète de cette question:

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

En bref, dans le jeu de style fichier:

<!--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> 

Dans le fichier de la fenêtre:

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

Cela vous donnera un résultat souhaité:

alt text

+20

Je sais que c'est une vieille réponse. Mais n'est-ce pas beaucoup de travail pour un centrage simple du contenu? – neebz

+1

Malheureusement, je n'ai trouvé aucune autre solution simple, si vous en avez, s'il vous plaît, partagez vos connaissances. –

+0

La raison principale est parce que le DataGrid contient DataGridRow qui contient DataGridCell qui Containt Contrôles. Vous voulez que ces contrôles soient centrés verticalement. C'est ce que fait Toucki. –

5

La valeur d'attribut VerticalAlignment="Center" centre le DataGrid dans son élément parent. Vous voulez probablement VerticalContentAlignment.

40

Pour définir les alignements de texte individuels que vous pouvez utiliser:

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

Oui cela fonctionne (Utilisez VerticalAlignment, puisque TextAlignment est pour le positionnement horizontal du texte), mais vous ' Il faudra définir des styles d'éléments pour toutes les colonnes (les colonnes Checkbox et les colonnes combobox devront avoir des styles différents). – surfen

+0

C'est comme ça, parce que cela ne casse pas les lignes de la grille si vous avez activé celles-ci. –

+0

Comment puis-je centrer le texte lors de l'édition? – Erik

16

Le code suivant alignera verticalement le contenu d'une cellule DataGridTextColumn:

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

Edit: J'ai revenir à ce problème et trouvé la solution ci-dessous pour mieux fonctionner, il va centrer le contenu de toutes les cellules dans DataGridTextRows à la fois horizontalement et verticalement.

<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

Ne fonctionne pas. Essayez de définir DataGrid RowHeight = 100 pour que les lignes soient plus hautes que la hauteur par défaut. le quadrillage aura l'air totalement bizarre. Votre première solution (DataGridTextColumn.ElementStyle) fonctionne mieux pour moi. – joedotnot

12

Vous pouvez également faire sans déroger à ControlTemplate:

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

Ne sait pas pourquoi cette réponse n'a pas de votes. C'est beaucoup plus simple que les réponses plus complexes, et ça marche bien! –

+4

Cette réponse ne fonctionne que lorsque vous n'avez pas de lignes de quadrillage verticales. Sinon, le quadrillage recevra un espace si vous définissez la propriété RowHeight. – Sven

1

Miser sur la réponse de Jamier, le code suivant fait l'affaire pour moi lors de l'utilisation des colonnes générées automatiquement:

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

Celui-ci fonctionne pour moi

<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> 
Questions connexes