StackPanel 孩子自动调整大小

Posted

技术标签:

【中文标题】StackPanel 孩子自动调整大小【英文标题】:StackPanel childs auto resize 【发布时间】:2017-10-11 19:08:04 【问题描述】:

我正在尝试创建一个包含三个网格的表单,每个网格在一行中都有 DataGrid 和 Button,在下面的一行中我有 GridSplitter 来调整内容的大小。 我希望表单显示内容的大小与屏幕大小成比例。我知道 StackPanel 不会调整内容的大小,但我需要让网格垂直堆叠。

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

【问题讨论】:

【参考方案1】:

我认为您需要创建一个具有 5 行 (RowDefinition) 的 Grid 而不是 StackPanel,并且在每一行中您放置表单并在下一行后面加上 GridSplitter,我的意思是您将在第 2 行和第 4 行中以两个 GridSplitters 结束。

试试这个修改后的标记版本:

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

【讨论】:

正确答案,但这会产生另一组问题,因为我需要在 ItemTemplate/DataTemplate 中呈现这些网格,这会产生一系列新问题,例如。 DataTemplate 只允许一个 VisualTree,这会导致 Grid/GridSplitter 出现问题。我会再发一篇关于这个问题的文章。 这是我的新问题***.com/questions/46705206/grid-content-auto-resize :)

以上是关于StackPanel 孩子自动调整大小的主要内容,如果未能解决你的问题,请参考以下文章

QML SplitView - 手动调整孩子的大小

如何在窗体调整大小时调整datagridview控件的大小

使绝对定位的孩子随他们的上级动态调整大小

wpf窗体当把他最大化时里面的控件也要调整位置的大小怎么做

调整超级视图大小时自动调整子视图大小

调整 div 大小时无法让 Google 地图高度自动调整大小