2010-07-30 17 views
5

I tienen una cuadrícula con 3 columnas y 5 filas:Wpf: Cuadrícula: ¿Cómo puedo compartir el ancho de altura de columna/fila?

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 

    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
     <RowDefinition/> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 

    <Label Grid.Row="0" Grid.Column="0">Gas Volume Fraction</Label> 
    <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Path=GasVolumeFraction}" MinWidth="40"></TextBox> 
    <Label Grid.Row="0" Grid.Column="2">-</Label> 

    <Label Grid.Row="1" Grid.Column="0">Density</Label> 
    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Path=Density}" MinWidth="40"></TextBox> 
    <Label Grid.Row="1" Grid.Column="2">kg/m3</Label> 

    <Label Grid.Row="2" Grid.Column="0" Content="Curve speed" Style="{StaticResource curveSpeed}" ></Label> 
    <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Path=Density}" Style="{StaticResource curveSpeed}" MinWidth="40"></TextBox> 
    <Label Grid.Row="2" Grid.Column="2" Style="{StaticResource curveSpeed}">rpm</Label> 

    <WrapPanel Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3"> 
     <RadioButton>Delta pressure</RadioButton> 
     <RadioButton>Head</RadioButton> 
    </WrapPanel> 

    <WrapPanel Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3"> 
     <RadioButton>Efficiency</RadioButton> 
     <RadioButton>Power</RadioButton> 
     <RadioButton>Torque</RadioButton> 
    </WrapPanel> 

</Grid> 

Los cuadros de texto y botones de radio tienen diferentes requisitos de espacio, lo que hace las filas render con diferentes alturas en función de su contenido. ¿Cómo puedo hacer que las filas sean de tamaño uniforme, pero no más grandes de lo necesario? En otras palabras: quiero la misma altura que configurar Height = "Auto" para una fila que contiene un cuadro de texto (el elemento más grande en mi grilla) y luego usar esa altura para todas las filas.

+0

¿Qué esperas que pase con los WrapPanels? Si restringe su altura, debe tener espacio para crecer horizontalmente. – slugster

Respuesta

12

Lo ideal sería utilizar filas con la estrella de tamaño a medida que tiene y establecer la cuadrícula con VerticalAlignment="Top", pero desafortunadamente dimensionamiento estrellas no funciona cuando los tamaños de retícula a su contenido.

En lugar de utilizar una sola cuadrícula, utilice un UniformGrid para el diseño vertical con controles de cuadrícula anidados para el diseño horizontal. Puede establecer SharedSizeScope en las columnas de las cuadrículas internas para que el tamaño de columna se comparta entre ellas.

<UniformGrid Rows="5" VerticalAlignment="Top" Grid.IsSharedSizeScope="True"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition SharedSizeGroup="A"/> 
      <ColumnDefinition SharedSizeGroup="B"/> 
      <ColumnDefinition SharedSizeGroup="C"/> 
     </Grid.ColumnDefinitions> 

     <Label Grid.Column="0">Gas Volume Fraction</Label> 
     <TextBox Grid.Column="1" Text="{Binding Path=GasVolumeFraction}" MinWidth="40"></TextBox> 
     <Label Grid.Column="2">-</Label> 
    </Grid> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition SharedSizeGroup="A"/> 
      <ColumnDefinition SharedSizeGroup="B"/> 
      <ColumnDefinition SharedSizeGroup="C"/> 
     </Grid.ColumnDefinitions> 

     <Label Grid.Column="0">Density</Label> 
     <TextBox Grid.Column="1" Text="{Binding Path=Density}" MinWidth="40"></TextBox> 
     <Label Grid.Column="2">kg/m3</Label> 
    </Grid> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition SharedSizeGroup="A"/> 
      <ColumnDefinition SharedSizeGroup="B"/> 
      <ColumnDefinition SharedSizeGroup="C"/> 
     </Grid.ColumnDefinitions> 
     <Label Grid.Column="0" Content="Curve speed" Style="{StaticResource curveSpeed}"></Label> 
     <TextBox Grid.Column="1" Text="{Binding Path=Density}" Style="{StaticResource curveSpeed}" MinWidth="40"></TextBox> 
     <Label Grid.Column="2" Style="{StaticResource curveSpeed}">rpm</Label> 
    </Grid> 
    <WrapPanel> 
     <RadioButton>Delta pressure</RadioButton> 
     <RadioButton>Head</RadioButton> 
    </WrapPanel> 
    <WrapPanel> 
     <RadioButton>Efficiency</RadioButton> 
     <RadioButton>Power</RadioButton> 
     <RadioButton>Torque</RadioButton> 
    </WrapPanel> 
</UniformGrid> 
1

Puede usar el enlace a ActualWidth y ActualHeight de su BlockBlock más grande.

<Grid x:Name="grid" ShowGridLines="True"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="{Binding Path=ActualHeight, ElementName=biggestTB}"/> 
      <RowDefinition Height="{Binding Path=ActualHeight, ElementName=biggestTB}"/>       
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=biggestTB}"/> 
      <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=biggestTB}"/>       
     </Grid.RowDefinitions> 
     <TextBlock Grid.Row="0" Grid.Column="0" x:Name="biggestTB" Text="biggest textblock content" TextWrapping="Wrap"/> 
     <TextBlock Grid.Row="1" Grid.Column="1" Text="content" TextWrapping="Wrap"/> 
    </Grid> 
+3

Tenga cuidado al vincular a ActualHeight y ActualWidth: hay muchas situaciones en las que el tamaño dinámico de los controles puede dar como resultado ciclos de eliminación del rendimiento en el proceso de medición y ordenación. –

34

Sé que esta es una vieja pregunta, pero voy a responder por cualquiera que tropiece con este mientras busca en Google.

En realidad, hay una solución muy simple a este problema, utilizando el SharedSizeScope mencionado por Quartermeister.

<Grid IsSharedSizeScope="True"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" SharedSizeGroup="groupName" /> 
     <RowDefinition Height="Auto" SharedSizeGroup="groupName" /> 
     <RowDefinition Height="Auto" SharedSizeGroup="groupName" /> 
    </Grid.RowDefinitions> 

    ... 
</Grid> 

Sólo asegúrese de que establece Grid.IsSharedSizeScope true, y asegúrese de que cada uno tiene el mismo RowDefinition SharedSizeGroup, y las filas debe ser automático y de igual tamaño. Esto también funciona para columnas.

+0

Al hacer esto, ¿todas las filas tendrán el tamaño más grande? – Dzyann

+5

@Dzyann: puede omitir el valor 'Height =" Auto '' para las filas que solo deberían tomar la altura y no contribuir con las suyas. – Pascal

Cuestiones relacionadas