GridSplitter 奇怪的行为,或者不是吗?

GridSplitter weird behavior, or is it not?

下面的代码进行了 3 行的行-列演示,其中最后一行有 3 列。在每个中,第二个元素是网格分离器。

如果拆分器的对齐方式设置为 "center",它会按预期工作以调整其他人的大小。但是如果水平设置为 left/right(或垂直设置为 top/bottom),它只会在扩展其单元格(不小于其大小)的同时缩小另外两个单元格(不小于其大小)

谁能解释一下为什么 GridSplitter 会这样?代码是简单的 WPF 代码,可以复制粘贴到 C# 或 VB WPF 应用程序的主要 xaml.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="25"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <DockPanel Grid.Row="0" Background="Lime">
        <Label Content="Label" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </DockPanel>
    <GridSplitter Grid.Row="1" Height="5" Background="#FF7F7F7F" VerticalAlignment="Center" HorizontalAlignment="Stretch"  ResizeDirection="Rows"/>
    <DockPanel Grid.Row="2">
        <Grid DockPanel.Dock="Top" Margin="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="25"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <DockPanel Grid.Column="0" Background="Red">
                <Label Content="Label" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </DockPanel>
            <GridSplitter Grid.Column="1" Width="5" Background="#FF7F7F7F" VerticalAlignment="Stretch" HorizontalAlignment="Center" ResizeDirection="Columns"/>
            <DockPanel Grid.Column="2"  Background="Blue">
                <Label Content="Label" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </DockPanel>
        </Grid>
    </DockPanel>
</Grid>

GridSplitter 有一个名为 ResizeBehavior 的 属性,它定义了问题描述的操作。如果未手动设置,默认行为是 BasedOnAlignment,这意味着它基于您设置的 Horizo​​ntalAlignment 和 VerticalAlignment 值。

如果按照代码中的设置,ResizeBehavior 默认为 PreviousAndNext。这将导致它在 GridSplitter 的任一侧重新分配 space。

代码中的GridSplitter部分相当于ResizeBehavior的这些手动设置。

...
<GridSplitter  ResizeBehavior="PreviousAndNext" Grid.Row="1" Height="5" Background="#FF7F7F7F" VerticalAlignment="Top"  HorizontalAlignment="Stretch" ResizeDirection="Rows"/>
...
<GridSplitter  ResizeBehavior="PreviousAndNext" Grid.Column="1" Width="5" Background="#FF7F7F7F" VerticalAlignment="Stretch" HorizontalAlignment="Left" ResizeDirection="Columns"/>
...

更新了有关 BasedOnAlignment 的默认 ResizeBehavior 的更多说明:

下面这个答案的末尾是 link 到 table 的图像,摘自 WPF 4.5 Unleashed 作者 Adam Nathan(我还没有足够的声誉将这张图片直接放在这里,所以我只能将其创建为 link)。

table 显示 GridSplitter 的外观(显示为彩色 rectangles/squares),具体取决于给定的 Horizo​​ntalAlignment 和 VerticalAlignment 设置。如果这些设置都没有拉伸,那么 GridSplitter 最终将变成一个小点,因此只有我们感兴趣的对齐方式之一设置为拉伸的情况(就像您在代码中所做的那样)。

当行或列按比例调整大小时(如您使用星号的情况),然后拖动 GridSplitter 会相应地更改 table 中指示的两个单元格的系数。

如您所见,当一个对齐方式设置为拉伸而另一个对齐方式设置为居中时,受影响的两个单元格是位于 GridSplitter 两侧的单元格。因此,您会看到您首先报告的行为,即两侧的单元格大小相同。

但是当设置为 Left/Right 或 Top/Bottom 值(取决于您使用的是垂直还是水平 GridSplitter)时,正如您从 table 中看到的那样, GridSplitter 本身成为两个受影响的单元格之一。因此,例如,如果它是一个垂直的 GridSplitter 并且您将 Horizo​​ntalAlignment 设置为 Left,您将只能将 GridSplitter 从它在中心开始的位置向左移动,这将使左侧单元格的大小变小并使 GridSplitter本身更大(并在此过程中从正确的单元格中删除 space)。但是,您不能将 GridSplitter 向右移动并缩小右侧的单元格。

Table: Cells Directly Affected When Dragging a GridSplitter with Various Alignment Settings