2009-05-22 4 views
52

J'ai un ensemble de paires clé/valeur que je veux afficher sur une fenêtre WPF. J'utilise une grille pour les poser comme ceci:Espacement entre les contrôles enfants dans WPF Grid

<Grid Margin="4"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 

    <Label Grid.Row="0" Grid.Column="0">Code</Label> 
    <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Code}"/> 

    <Label Grid.Row="1" Grid.Column="0">Name</Label> 
    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Name}"/> 
</Grid> 

Cependant lorsque je visualise cela, les zones de texte sont écrasés avec leurs frontières supérieure et inférieure toucher la zone de texte ci-dessus/au-dessous. Quel est le meilleur moyen d'ajouter de l'espace vertical aux lignes de cette mise en page?

+0

Solution assez simple: ajoutez simplement des lignes supplémentaires avec une hauteur fixe. Donc, si vous voulez un espace de 3 pixels entre les lignes, il suffit de créer une nouvelle ligne entre eux avec une hauteur de 3. – Krythic

Répondre

78

Le moyen le plus simple consiste à définir une marge sur les commandes individuelles. Le paramétrer sur les TextBox devrait suffire, car une fois espacées, les étiquettes seront placées verticalement au centre de chaque rangée et disposeront de beaucoup d'espace de toute façon.

Vous pouvez définir à l'aide une fois le style:

<Grid Margin="4"> 
    <Grid.Resources> 
     <Style TargetType="{x:Type TextBox}"> 
      <Setter Property="Margin" Value="0,0,0,4" /> 
     </Style> 
    </Grid.Resources> 

    ... 
</Grid> 

Cela ajoutera une marge de 4 pixels au bas de chaque zone de texte dans votre grille.

+0

Cela ne semble pas fonctionner pour moi. Est-ce que cela ne fonctionne pas si le contrôle en question a déjà un style? Je peux définir la marge manuellement sur le contrôle, mais pas via votre exemple. – Krythic

+0

J'ai trouvé une autre solution. Tout ce que j'ai fait était d'ajouter une ligne supplémentaire entre les contrôles d'une hauteur de 3 pixels. Fonctionne comme un charme. – Krythic

47

Une autre approche agréable peut être vu ici: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between-items-in-stackpanel.aspx

Il montre comment créer un comportement attaché, de sorte que la syntaxe comme cela fonctionne:

<StackPanel local:MarginSetter.Margin="5"> 
    <TextBox Text="hello" /> 
    <Button Content="hello" /> 
    <Button Content="hello" /> 
</StackPanel> 

C'est le & plus facile la plus rapide de Définissez la marge sur plusieurs enfants d'un panneau, même s'ils ne sont pas du même type. (Par exemple, boutons, zones de texte, zones de liste déroulantes, etc.)

+4

+1 Très bien. J'ai changé le nom de la classe en LayoutSetter et ajouté d'autres propriétés comme VerticalAlignment pour le propager de la même manière. J'aimerais pouvoir simplement définir un style pour FrameworkElement ... – surfen

+1

+1, Elad, c'est très bien – Luke

+0

Notez que cela ne fonctionne pas si les éléments enfants sont ajoutés/supprimés dynamiquement, comme dans un ItemsControl lié à une collection changeante . –

2

Qu'en est-il de la définition de l'alignement vertical de TextBox au centre?

<Grid Margin="4"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 

       <Label Grid.Row="0" Grid.Column="0">Code</Label> 
       <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Code}" VerticalAlignment="Center"/> 

       <Label Grid.Row="1" Grid.Column="0">Name</Label> 
       <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Name}" VerticalAlignment="Center"/> 
      </Grid> 
Questions connexes