多个自动列定义导致奇怪的GridSplitter行为

时间:2017-03-06 12:32:56

标签: wpf gridsplitter wpfgrid

我有以下XAML:

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBlock Text="0,0" Grid.Column="0" Background="Yellow" />
        <TextBlock Text="1,0" Grid.Column="1" Background="SkyBlue" />
        <GridSplitter Width="20" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Stretch" ShowsPreview="True" />
        <TextBlock Text="3,0" Grid.Column="3" Grid.Row="0" />
    </Grid>
</Window>

如果只有ColumnDefinition Width Auto GridSplitter,则Width正常工作。但是,如果有多个列Auto Auto,则GridSplitter列会在移动1,0时调整大小(可在单元格{{1中看到] }})。

调整大小之前:

enter image description here

调整大小后:

enter image description here

如何阻止GridSplitter调整第二列的大小?

3 个答案:

答案 0 :(得分:5)

如果您无法修改现有列,也许您可​​以尝试以编程方式实现此行为......

为列命名:

<Grid.ColumnDefinitions>
    <ColumnDefinition Name="firstColumn" Width="*" />
    <ColumnDefinition Name="secondColumn" Width="Auto" />
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

向网格spliiter添加事件:

<GridSplitter Name="gridSplitter" DragStarted="gridSplitter_DragStarted" DragCompleted="gridSplitter_DragCompleted" />

然后只需在拆分器拖动之前保存列宽,并将更改应用于第一列宽度,而不是第二列:

public partial class MainWindow : Window
{
    private double savedFirstColumnWidth;
    private double savedSecondColumnWidth;

    private void gridSplitter_DragStarted(object sender, DragStartedEventArgs e)
    {
        // Save the initial column width values
        savedFirstColumnWidth = firstColumn.ActualWidth;
        savedSecondColumnWidth = secondColumn.ActualWidth;
    }

    private void gridSplitter_DragCompleted(object sender, DragCompletedEventArgs e)
    {           
        double dragChange = e.HorizontalChange;

        // Change the width of the first column instead of second
        firstColumn.Width = new GridLength(savedFirstColumnWidth + dragChange);
        // Set the with of the second column to the value saved before the drag
        secondColumn.Width = new GridLength(savedSecondColumnWidth);
    }
}

答案 1 :(得分:2)

我会修改布局以确保GridSplitter正在使用相邻的网格列:

 final Pattern pr = Pattern.compile(Pattern.quote("Q$(w+)E"));

答案 2 :(得分:1)

我一直在做一些测试,我相信我可以解释发生了什么,即使我不完全确定如何解决它。

测试: 移动分离器并观察(0,0)和(3,0)的相对大小。它们总是完全相同。

结论:此行为是(0,0)和(3,0)都是* width的结果,因此每个都有可用宽度的一半。但是,分离器对(3,0)的大小设置了限制。由于(3,0)对其大小有限制,但也应该具有可用宽度的一半,这意味着(0,0)也具有与(3,0)相同的大小限制。当分离器力(3,0)收缩时,(0,0)也必须收缩以保持*宽度指定的比例。结果(1,0)和(2,0)是唯一允许增长以填充剩余空间的列,并且因为(2,0)仅包含静态宽度为20的分割器,(1, 0)增长以填补剩余空间。

正如我所说,我不知道如何解决这个问题,但解决问题的第一步是理解它。所以希望这有助于有人发现解决方案。

编辑:进一步测试表明只有当(1,0)设置为自动或固定宽度时,上述情况才为真。如果将(1,0)设置为*或*的某个倍数,那么所有*部分似乎都表现得很奇怪,并且在不考虑它们所谓的比例的情况下增长和缩小。

EDIT2:环顾四周,我来到这个链接:https://wpf.2000things.com/tag/gridsplitter/

该链接中提到的一件事情如下:

  

回想一下GridSplitter在它自己的列中和它的   设置为“中心”的Horizo​​ntalAlignment将调整任一侧的列的大小   它的。在下面的示例中,列0和2的大小调整,但是   第3列的宽​​度不会改变。

我测试中观察到的所有行为都符合该链接中提到的一个示例,所以我的新结论是这种行为都是有意的,而不是像我一直认为的那样奇怪的错误。