GridSplitter奇怪的行为,还是不是?

时间:2018-04-23 22:18:24

标签: c# wpf vb.net gridsplitter

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

如果拆分器的对齐设置为“中心”,则按预期工作以调整其他人的大小。但如果它被设置为左/右水平(或垂直的顶部/底部),它只会缩小其他两个,同时扩展其单元格(不小于其大小)

有人可以解释为什么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>

1 个答案:

答案 0 :(得分:2)

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

如果它们在代码中设置,则ResizeBehavior默认为PreviousAndNext。这将导致它重新分配GridSplitter两侧的空间。

代码中的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的更多说明:

在下面这个答案的最后是一个链接到一本表摘录自 WPF 4.5 Unleashed 由Adam Nathan (我还没有将此图像直接放在此处的声誉,因此只允许将其创建为链接)。

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

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

正如您所看到的那样,当一个对齐设置为拉伸而另一个对齐设置为中心时,受影响的两个单元格是GridSplitter两侧的单元格。因此,您可以看到首次报告任何一侧单元格大小相等的行为。

但是当设置为Left / Right或Top / Bottom值时(取决于您是使用垂直或水平GridSplitters),然后,从表中可以看出,GridSplitter本身就成为两个受影响的单元格之一。因此,例如,如果它是一个垂直的GridSplitter,并且你将Horizo​​ntalAlignment设置为Left,那么你只能将GridSplitter从中心向左移动的位置移动,这样可以将左边的单元格缩小并生成GridSplitter本身更大(并在此过程中从正确的细胞中夺走空间)。但是,您不能将GridSplitter向右移动并使正确的单元格更小。

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