2

我已经定义了我的 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>

现在,当窗口重新调整大小时,它只会改变绿色边框的宽度,而红色边框的宽度保持不变。谢谢!

4

2 回答 2

2

如果您不介意后面的一些代码,您可以通过对拆分器的 DragDelta 事件做出反应并调整第一列的宽度、移除星形宽度并根据拖动增量固定宽度来实现此行为。

xml:

<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);
    }
}
于 2013-03-27T16:39:20.077 回答
0

我使用了 mathieu 的片段 - 并对其进行了修改以供使用后面的代码。在我的情况下,我需要由 GridSplitter 调整大小的动态项目数。

我使用拇指控件来完全控制动作

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;
    }
于 2019-10-28T13:13:36.400 回答