Search code examples
wpfxamlblend

StackPanel childs auto resize


I'm trying to create a form that contains three grids, each grid has DataGrid and Button in one row and in a row below I have GridSplitter to resize content. I would like that on form display content is resized proportionally to the screen size. I know that StackPanel does not resize content but then again I need to have grids stacked vertically.

    <StackPanel Orientation="Vertical" VerticalAlignment="Stretch" Height="Auto">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <DataGrid>
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Col 1" />
                        <DataGridTextColumn Header="Col 2" />
                        <DataGridTextColumn Header="Col 3" />
                    </DataGrid.Columns>
                </DataGrid>
                <Button Grid.Column="1" Content="Btn" />
            </Grid>
            <GridSplitter Height="5" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Grid.Row="0" ResizeDirection="Rows" ResizeBehavior="CurrentAndNext"/>
        </Grid>

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <DataGrid>
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Col 1" />
                        <DataGridTextColumn Header="Col 2" />
                        <DataGridTextColumn Header="Col 3" />
                    </DataGrid.Columns>
                </DataGrid>
                <Button Grid.Column="1" Content="Btn" />
            </Grid>
            <GridSplitter Height="5" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Grid.Row="0" ResizeDirection="Rows" ResizeBehavior="CurrentAndNext"/>
        </Grid>

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <DataGrid>
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Col 1" />
                        <DataGridTextColumn Header="Col 2" />
                        <DataGridTextColumn Header="Col 3" />
                    </DataGrid.Columns>
                </DataGrid>
                <Button Grid.Column="1" Content="Btn" />
            </Grid>
            <GridSplitter Height="5" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Grid.Row="0" ResizeDirection="Rows" ResizeBehavior="CurrentAndNext"/>
        </Grid>
    </StackPanel>

Solution

  • I think you need to create a Grid that has 5 Rows (RowDefinition) instead of a StackPanel and in each row you put your form and follow the next row with a GridSplitter, i mean you will end up with two GridSplitters in rows 2 and 4.

    Try this modified verison of your markup:

    <Window ...>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <Grid Grid.Row="0">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <DataGrid>
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Col 1" />
                            <DataGridTextColumn Header="Col 2" />
                            <DataGridTextColumn Header="Col 3" />
                        </DataGrid.Columns>
                    </DataGrid>
                    <Button Grid.Column="1" Content="Btn" />
                </Grid>
            </Grid>
    
            <GridSplitter Height="5" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Row="1" ResizeDirection="Rows" />
    
            <Grid Grid.Row="2">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <DataGrid>
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Col 1" />
                            <DataGridTextColumn Header="Col 2" />
                            <DataGridTextColumn Header="Col 3" />
                        </DataGrid.Columns>
                    </DataGrid>
                    <Button Grid.Column="1" Content="Btn" />
                </Grid>
            </Grid>
    
            <GridSplitter Height="5" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Row="3" />
    
            <Grid Grid.Row="4">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <DataGrid>
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Col 1" />
                            <DataGridTextColumn Header="Col 2" />
                            <DataGridTextColumn Header="Col 3" />
                        </DataGrid.Columns>
                    </DataGrid>
                    <Button Grid.Column="1" Content="Btn" />
                </Grid>
            </Grid>
        </Grid>
    </Window>