我想制作一个自定义 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 .
显然我可以通过在后面的代码中设置列宽来在父级中完成此操作。但我想在其他部分重用此功能并使其尽可能简单易用。
实现此目的的最佳方法是创建您自己的
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.