2012-06-21 26 views
5

Esta pregunta es difícil de describir sucintamente, así que tengan paciencia conmigo.WPF Tamaño de la cuadrícula

Actualmente tengo una cuadrícula con dos filas. La altura de la primera fila es Automático, y la altura de la segunda fila es *, así que cuando cambio el tamaño de la ventana, la segunda fila crece y se contrae según la ventana.

Ésta es la disposición básica:

<Window> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Border> 
      ... 
     </Border> 
     <Border Grid.Row="2"> 
      ... 
     </Border> 
    </Grid> 
</Window> 

Aquí es un pobre esbozo del comportamiento existente:

____ ____ ____ 
    ->  -> 
____ ____ ____ 
       ____ 
     ____ 
____ 

Me gustaría añadir una especie de 'altura mínima' a la segunda fila , de modo que cuando cambio el tamaño de la ventana lo suficientemente pequeño, la segunda fila deja de reducirse, y la primera fila comienza a encogerse. comportamiento

deseado:

____ ____ ____ 
    ->  -> ____ 
____ ____ 
       ____ 
     ____ 
____ 

¿Hay una forma sencilla de obtener la altura mínima para la segunda fila, y forzar el primero para reducir el tamaño?

Más detalles:

Cuando fijo MinHeight en la segunda fila, sólo clips de la red cuando cambio el tamaño por debajo de ese tamaño.

El tamaño de los controles en la primera fila se desconoce en tiempo de compilación, pero se conoce en tiempo de ejecución. Si es una parte necesaria de la solución, podría establecer MaxHeight de la fila, pero ahora mismo está funcionando una altura automática.

Los controles en la segunda fila no tienen un tamaño explícito. Se les permite cambiar el tamaño, pero trato de evitar que se vuelvan más pequeños que la altura mínima deseada.

Respuesta

7

El tamaño de los controles en la primera fila se desconoce en tiempo de compilación, pero se conoce durante el tiempo de ejecución. Si es una parte necesaria de la solución, podría establecer MaxHeight de la fila, pero ahora mismo está funcionando una altura automática.

Creo que esta será probablemente la solución más fácil. Obligar a la MaxHeight al valor calculado en tiempo de ejecución:

<Grid.RowDefinitions> 
    <RowDefinition Height="*" MaxHeight="{Binding MyProperty}"/> 
    <RowDefinition Height="*" MinHeight="100"/> 
</Grid.RowDefinitions> 

Editar: La solución anterior está cerca, pero no es correcto. Aquí es una forma de lograr el resultado deseado, sin embargo, no está seguro de si es el método óptimo:

<Grid ShowGridLines="True" Name="myGrid"> 
    <Grid.Resources> 
     <local:RowHeightConverter x:Key="rowHeightConverter" /> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition Name="row1" MaxHeight="{Binding MyProperty}"> 
      <RowDefinition.Height> 
       <MultiBinding Converter="{StaticResource rowHeightConverter}"> 
        <Binding Path="ActualHeight" ElementName="row2" /> 
        <Binding Path="ActualHeight" ElementName="myGrid" /> 
        <Binding Path="MaxHeight" ElementName="row1" /> 
       </MultiBinding> 
      </RowDefinition.Height> 
     </RowDefinition> 
     <RowDefinition Name="row2" Height="*" MinHeight="300"/> 
    </Grid.RowDefinitions> 
</Grid> 

Y su convertidor:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    double row2Height = (double)values[0]; 
    double gridHeight = (double)values[1]; 
    double row1MaxHeight = (double)values[2]; 

    if (gridHeight - row2Height >= row1MaxHeight) 
    { 
     return gridHeight - row2Height; 
    } 

    return row1MaxHeight; 
} 
+0

no funciona. La altura de la primera fila se comporta exactamente como lo haría si la segunda fila no tuviera MinHeight. Solo cambia el tamaño la mitad de la velocidad que la ventana. Esto provoca que se recorte la segunda fila. –

+0

@KendallFrey La solución anterior no funcionó en todos los casos, así que agregué una solución que debería satisfacer sus necesidades. –

+0

Gracias por el MultiBinding. No sabía sobre eso. Una pregunta: la cuadrícula actual tiene varias otras filas fijas y de tamaño automático, así que supongo que debería hacer 'gridHeight - row2height - row3height', etc.? –

Cuestiones relacionadas