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

Zev*_*itz 8 wpf gridsplitter wpf-grid

我有以下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>
Run Code Online (Sandbox Code Playgroud)

当只有一个ColumnDefinitionWidthAuto,在GridSplitter正常工作.然而,一旦存在与多个列WidthAuto,所述第一Auto列中的时也被调整大小GridSplitter移动(可在细胞中可以看出1,0).

在调整大小之前:

在此输入图像描述

调整大小后:

在此输入图像描述

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

Nem*_*nda 5

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

命名列:

<Grid.ColumnDefinitions>
    <ColumnDefinition Name="firstColumn" Width="*" />
    <ColumnDefinition Name="secondColumn" Width="Auto" />
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
Run Code Online (Sandbox Code Playgroud)

将事件添加到网格spliiter:

<GridSplitter Name="gridSplitter" DragStarted="gridSplitter_DragStarted" DragCompleted="gridSplitter_DragCompleted" />
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)