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,这意味着它基于您设置的 HorizontalAlignment 和 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),具体取决于给定的 HorizontalAlignment 和 VerticalAlignment 设置。如果这些设置都没有拉伸,那么 GridSplitter 最终将变成一个小点,因此只有我们感兴趣的对齐方式之一设置为拉伸的情况(就像您在代码中所做的那样)。
当行或列按比例调整大小时(如您使用星号的情况),然后拖动 GridSplitter 会相应地更改 table 中指示的两个单元格的系数。
如您所见,当一个对齐方式设置为拉伸而另一个对齐方式设置为居中时,受影响的两个单元格是位于 GridSplitter 两侧的单元格。因此,您会看到您首先报告的行为,即两侧的单元格大小相同。
但是当设置为 Left/Right 或 Top/Bottom 值(取决于您使用的是垂直还是水平 GridSplitter)时,正如您从 table 中看到的那样, GridSplitter 本身成为两个受影响的单元格之一。因此,例如,如果它是一个垂直的 GridSplitter 并且您将 HorizontalAlignment 设置为 Left,您将只能将 GridSplitter 从它在中心开始的位置向左移动,这将使左侧单元格的大小变小并使 GridSplitter本身更大(并在此过程中从正确的单元格中删除 space)。但是,您不能将 GridSplitter 向右移动并缩小右侧的单元格。
Table: Cells Directly Affected When Dragging a GridSplitter with Various Alignment Settings
下面的代码进行了 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,这意味着它基于您设置的 HorizontalAlignment 和 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),具体取决于给定的 HorizontalAlignment 和 VerticalAlignment 设置。如果这些设置都没有拉伸,那么 GridSplitter 最终将变成一个小点,因此只有我们感兴趣的对齐方式之一设置为拉伸的情况(就像您在代码中所做的那样)。
当行或列按比例调整大小时(如您使用星号的情况),然后拖动 GridSplitter 会相应地更改 table 中指示的两个单元格的系数。
如您所见,当一个对齐方式设置为拉伸而另一个对齐方式设置为居中时,受影响的两个单元格是位于 GridSplitter 两侧的单元格。因此,您会看到您首先报告的行为,即两侧的单元格大小相同。
但是当设置为 Left/Right 或 Top/Bottom 值(取决于您使用的是垂直还是水平 GridSplitter)时,正如您从 table 中看到的那样, GridSplitter 本身成为两个受影响的单元格之一。因此,例如,如果它是一个垂直的 GridSplitter 并且您将 HorizontalAlignment 设置为 Left,您将只能将 GridSplitter 从它在中心开始的位置向左移动,这将使左侧单元格的大小变小并使 GridSplitter本身更大(并在此过程中从正确的单元格中删除 space)。但是,您不能将 GridSplitter 向右移动并缩小右侧的单元格。
Table: Cells Directly Affected When Dragging a GridSplitter with Various Alignment Settings