2009-05-22 10 views
52

Ho un set di coppie chiave/valore che desidero visualizzare su una finestra WPF. Sto utilizzando una griglia per gettare fuori in questo modo:Spaziatura tra i controlli figlio nella griglia WPF

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

Tuttavia quando visualizzo questo, le caselle di testo sono schiacciate con i loro bordi superiore e inferiore di toccare il testo sopra/sotto. Qual è il modo migliore per aggiungere spazio verticale alle righe in questo layout?

+0

Soluzione piuttosto semplice: basta aggiungere altre righe con un'altezza impostata. Quindi, se vuoi uno spazio di 3 pixel tra le righe, crea una nuova riga tra di loro con un'altezza impostata di 3. – Krythic

risposta

78

Il metodo più semplice consiste nell'impostare un margine sui singoli controlli. L'impostazione sui TextBox dovrebbe essere sufficiente, perché una volta distanziati, le etichette verranno posizionate verticalmente al centro di ogni riga e avranno comunque molto spazio.

È possibile impostare una volta con uno stile:

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

    ... 
</Grid> 

Questo aggiunge un margine di 4 pixel per il fondo di qualsiasi TextBox all'interno della vostra rete.

+0

Questo non sembra funzionare per me. Non funziona se il controllo in questione ha già uno stile? Posso impostare manualmente il margine sul controllo, ma non tramite il tuo esempio. – Krythic

+0

Ho trovato una soluzione alternativa. Tutto ciò che ho fatto è stato aggiungere una riga aggiuntiva tra i controlli con un'altezza di 3 pixel. Funziona come un fascino. – Krythic

47

Un altro approccio bello può essere visto qui: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between-items-in-stackpanel.aspx

Essa mostra come creare un comportamento allegato, in modo che la sintassi come questo dovrebbe funzionare:

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

Questo è il più facile & modo più veloce per imposta Margine su diversi figli di un pannello, anche se non sono dello stesso tipo. (I pulsanti, caselle di testo, comboBox, ecc.)

+4

+1 Grande. Ho cambiato il nome della classe in LayoutSetter e ho aggiunto altre proprietà come VerticalAlignment per propagarlo allo stesso modo. Vorrei poter semplicemente definire uno stile per FrameworkElement ... – surfen

+1

+1, Elad, è molto bello – Luke

+0

Nota che questo non funziona se gli elementi figli vengono aggiunti/rimossi dinamicamente, come in un oggetto ItemsControl associato a una collezione mutevole . –

2

Che ne dici di impostare VerticalAlignment di TextBox su Center?

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