调整其父窗口大小时的WPF GridSplitter行为

时间:2013-03-27 16:24:25

标签: wpf resize window gridsplitter

我已经定义了我的GridSplittler XAML,如下所示。

<Window>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
    </Grid>

    <Border Grid.Column="0" Background="Red" />
    <GridSplitter Grid.Column="1" ResizeDirection="Columns" Width="3" Height="Auto" HorizontalAlighment="Stretch" VerticalAlignment="Stretch" />
    <Border Grid.Column="0" Background="Green" />

</Window>

这将创建两列,它们之间有一个网格分割器,当左右拖动网格分割器时,它将正确调整列的大小。现在,如果您调整整个窗口的大小,我希望左侧红色列的宽度保持固定,并使右侧绿色列的宽度发生变化(随着窗口调整大小)。它与调整整个Visual Studio应用程序和解决方案资源管理器宽度保持固定但代码选项卡宽度更改时的效果相同。也与SQL Server Management Studio相同;对象资源管理器宽度保持固定,但SQL选项卡宽度更改。我意识到这两个例子使用了更复杂的对接控件,但我希望使用WPF GridSplitter获得相同的结果。

编辑:根据mathieu建议,所有必要的是给第一列定义一个初始宽度(使用下面的200显示)。

<Grid Name="GridName">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Border Grid.Column="0" Background="Red" />
    <GridSplitter Name="SplitterName" Grid.Column="1" ResizeDirection="Columns" Width="3" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
    <Border Grid.Column="2" Background="Green" />
</Grid>

现在,当窗口重新调整大小时,它只会更改绿色边框的宽度,并且红色边框的宽度保持固定。谢谢!

2 个答案:

答案 0 :(得分:1)

如果你不介意一些代码,你可以通过对分割器的DragDelta事件做出反应,并通过删除星形宽度来调整第一列的宽度,并根据拖三角洲。

Xaml:

<Grid Name="GridName">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Border Grid.Column="0" Background="Red" />
    <GridSplitter Name="SplitterName" Grid.Column="1" ResizeDirection="Columns" Width="3" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
    <Border Grid.Column="2" Background="Green" />
</Grid>

背后的代码

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        SplitterName.DragDelta += SplitterNameDragDelta;
    }

    private void SplitterNameDragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
    {
        GridName.ColumnDefinitions[0].Width = new GridLength(GridName.ColumnDefinitions[0].ActualWidth + e.HorizontalChange);
    }
}

答案 1 :(得分:0)

我使用过mathieu的代码段-并将其修改为使用后的代码。 就我而言,我需要由GridSplitter调整大小的动态数量的项目。

我使用Thumb控件完全控制了动作

private Thumb GetNewThumbAsGridSplitter(int column)
    {
        var gs = new Thumb();
        gs.SetValue(Grid.ColumnProperty, column);
        // gs.SetValue(Grid.RowSpanProperty, 2);
        // gs.SetValue(Grid.RowProperty, 1);
        gs.Width = 5;
        gs.MouseEnter += (o, i) =>
        {
            Mouse.OverrideCursor = Cursors.ScrollWE;
        };
        gs.MouseLeave += (o, i) =>
        {
            Mouse.OverrideCursor = Cursors.Arrow;
        };
        gs.DragDelta += (o, i) =>
        {
            var grid = (Grid)gs.Parent;
            var previous = (YourControl)((grid.Children[column - 1]));
            var next = (YourControl)(grid.Children[column + 1]);

            if (next.MinWidth >= (next.ActualWidth - i.HorizontalChange))
            {
                return;
            }

            if (previous.MinWidth >= (previous.ActualWidth + i.HorizontalChange))
            {
                return;
            }

            previous.Width = previous.ActualWidth + i.HorizontalChange;
            next.Width = next.ActualWidth - i.HorizontalChange;
        };

        return gs;
    }