2011-01-11 11 views
23

creo un GridSplitter a través de las 3 filas que tengo en la rejilla de la siguiente manera:¿Hay un RowSpan = "Todo" en WPF?

<GridSplitter Grid.Row="0" Grid.Column="1" Background="Yellow" 
       HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
       Width="Auto" Height="Auto" ResizeDirection="Columns" 
       Grid.RowSpan="3" ... 

Sin embargo, es concebible que podría añadir otra fila a mi rejilla en una etapa posterior, y realmente no me Quiero volver atrás y actualizar todas mis filas.

Mi primera conjetura fue Grid.RowSpan="*", pero eso no compila.

Respuesta

14

Puede enlazar a RowDefinitions.Count pero necesitaría actualizar el enlace al agregar filas manualmente.

Editar: Sólo semi-manual, de hecho,
Xaml:

<StackPanel Orientation="Vertical"> 
    <Grid Name="GridThing"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/>   
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition /> 
      <RowDefinition /> 
      </Grid.RowDefinitions> 
      <Grid.Children> 
       <Button Content="TopRight" Grid.Row="0" Grid.Column="1"/> 
       <Button Content="LowerRight" Grid.Row="1" Grid.Column="1"/> 
      <Button Content="Span Rows" Name="BSpan" Grid.RowSpan="{Binding RelativeSource={RelativeSource AncestorType=Grid}, Path=RowDefinitions.Count, Mode=OneWay}"/> 
     </Grid.Children> 
     </Grid> 
    <Button Click="Button_Click" Content="Add Row" /> 
</StackPanel> 

Código:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     GridThing.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(20) }); 
     foreach (FrameworkElement child in GridThing.Children) 
     { 
      BindingExpression exp = child.GetBindingExpression(Grid.RowSpanProperty); 
      if (exp != null) 
      { 
       exp.UpdateTarget(); 
      } 
     } 
    } 
+1

Asegúrese de que la unión es Grid.RowSpan Modo = OneTime, o habrá una pérdida de memoria. RowDefinitions no es DependencyProperty, por lo que habrá una pérdida de memoria si el enlace no es OneTime. https://support.microsoft.com/en-us/kb/938416 – jasonp

+0

¿Cómo se puede marcar esto como la respuesta aceptada? 'RowDefinitions' no es una colección observable, por lo que el enlace no se actualizará cuando agregue una fila. –

+1

@GLewis: ¿Has leído la respuesta? Todo eso se toma en consideración. –

1

El control Grid no proporciona nada como esto de la caja. Es concebible que pueda implementar un MarkupExtension o algún otro truco para habilitar esto.

28

Una solución simple:

<!-- RowSpan == Int32.MaxValue --> 
<GridSplitter Grid.Row="0" 
       Grid.Column="1" 
       Grid.RowSpan="2147483647" /> 
+0

Llamo a hax en esto ... –

+0

Puede confirmar en Kaxaml o similar, recuerde usar un 'Height' en su' RowDefinition' aunque las nuevas filas no se "mostrarán". Puedo o no estar usando esto en el software de producción :) – user7116

+2

Además, esto funciona debido a un 'Math.Min' llamado en' ColumnSpanProperty' y 'RowSpanProperty' con respecto al número de columnas o filas restantes. – user7116

Cuestiones relacionadas