2009-05-22 24 views
52

Tengo un conjunto de pares clave/valor que quiero mostrar en una ventana de WPF. Estoy usando una cuadrícula para sentar a cabo de esta manera:Espaciado entre controles secundarios en cuadrícula 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> 

Sin embargo, cuando puedo mostrar esto, los cuadros de texto se aplastan con sus bordes superior e inferior de tocar el cuadro de texto de arriba/abajo. ¿Cuál es la mejor manera de agregar espacio vertical a las filas en este diseño?

+0

Solución bastante simple: simplemente agregue filas adicionales con una altura establecida. Entonces, si quiere un espacio de 3 píxeles entre filas, simplemente cree una nueva fila entre ellos con una altura establecida de 3. – Krythic

Respuesta

78

La manera más fácil es establecer un margen en los controles individuales. Establecerlo en los cuadros de texto debería ser suficiente, porque una vez que están espaciados, las etiquetas se establecerán verticalmente en el centro de cada fila y tendrán mucho espacio de todos modos.

Se puede establecer una vez usando un estilo:

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

    ... 
</Grid> 

Esto añadirá un margen de 4 píxeles a la parte inferior de cualquier cuadro de texto dentro de su red.

+0

Esto no parece funcionar para mí. ¿Esto no funciona si el control en cuestión ya tiene un estilo? Puedo establecer el margen manualmente en el control, pero no a través de tu ejemplo. – Krythic

+0

Encontré una solución alternativa. Todo lo que hice fue agregar una fila adicional entre los controles con una altura de 3 píxeles. Funciona de maravilla. – Krythic

47

Otro acercamiento agradable se puede ver aquí: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between-items-in-stackpanel.aspx

Se muestra cómo crear un comportamiento adjunto, por lo que la sintaxis como esto funcionaría:

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

Este es el & manera más fácil y rápida establezca Margen en varios elementos secundarios de un panel, incluso si no son del mismo tipo. (Es decir, Botones, TextBoxes, ComboBoxes, etc.)

+4

+1 Genial. Cambié el nombre de la clase a LayoutSetter y agregué algunas otras propiedades como VerticalAlignment para propagarlo de la misma manera. Me gustaría simplemente definir un estilo para FrameworkElement ... – surfen

+1

+1, Elad, eso es muy bueno – Luke

+0

Tenga en cuenta que esto no funciona si los elementos secundarios se agregan/quitan dinámicamente, como en un ItemsControl vinculado a una colección cambiante . –

2

¿Qué hay sobre la configuración de VerticalAlignment de TextBox al centro?

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