需要可以自动调整大小为零的WPF GridSplitter

问题描述 投票:0回答:1

我想制作一个自定义 GridSplitter,它结合了常规拆分器行为和一个功能 - 当拆分器自动将其中一个区域的大小调整为零时。

所以正常用法是:

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="0.5*" Name="A"/>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="0.5*" Name="B"/>
  </Grid.ColumnDefinitions>
  
  <GridSplitter Grid.Column="1"... />

最初 - A 列和 B 列具有相同的大小 = 可用宽度的 50%。 用户可以拖动分隔符来更改其宽度。 现在我希望用户能够双击拆分器(或任何其他方式启动操作) - 并且列 A 调整为 0,B 调整为 100%,如果再次操作 - 然后 A 调整为 100%,B 调整为 0 .

显然我可以通过在后面的代码中设置列宽来在父级中完成此操作。但我想在其他部分重用此功能并使其尽可能简单易用。

c# wpf .net-core .net-8.0
1个回答
0
投票

实现此目的的最佳方法是创建您自己的

GridSplitter
或使用 附加属性向其添加行为。

这里我通过继承来提供

GridSplitter
的自定义实现。
要移动分离器,我使用
GridSplitterAutomationPeer
:

public class MyGridSplitter : GridSplitter
{
    private readonly ITransformProvider _automationPeer;

    public MyGridSplitter()
    {
        _automationPeer = new GridSplitterAutomationPeer(this);
    }

    protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
    {
        base.OnMouseDoubleClick(e);

        var prtp = GetPositionRelativeToParent();
        if (prtp.X is 0)
        {
            _automationPeer.Move(double.MaxValue, double.MaxValue);
        }
        else
        {
            _automationPeer.Move(-double.MaxValue, -double.MaxValue);
        }
    }

    private Point GetPositionRelativeToParent()
    {
        return TranslatePoint(new Point(0, 0), VisualTreeHelper.GetParent(this) as UIElement);
    }
}

你这样使用它:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="3" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Label Grid.Column="0" Content="LEFT" HorizontalAlignment="Center" VerticalAlignment="Center" />
    <local:MyGridSplitter Grid.Column="1" HorizontalAlignment="Stretch" />
    <Label Grid.Column="2" Content="RIGHT" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

注意:仅测试左右行为。
工作代码可在here.

© www.soinside.com 2019 - 2024. All rights reserved.