我正在用列间的网格分隔符创建3列UI。我有要求保存列的状态,以便如果用户关闭并重新打开应用程序,它看起来就像他们离开它。但我也试图让列按比例分割 - 我的意思是,如果您拉伸窗口,所有三个面板都会增长,如果您移动左侧分割线,它将更改左侧和中间列之间的分割。WPF GridSplitter - 保存和恢复位置并按比例分割
我目前只实现了第一个要求 - 它节省了列宽的状态。我也使这些列强制所有三列的最小宽度。但据我了解,分配器按比例分配的方式是使用星号大小的列宽。由于我正在使用Width属性来保存和恢复状态,我不确定我能完成我想要的操作。
有没有人设法保存列宽的状态,并有拆分成比例?
这里是什么,我已经得到了一些目前代码:
<Grid x:Name="mainGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="leftColumn" Width="{Binding MainWindowLeftColumnWidth, Mode=TwoWay, Source={x:Static prop:Settings.Default}}" MinWidth="200" MaxWidth="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}, Path=LeftColumnMaxWidth, Mode=OneWay}"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition x:Name="centerColumn" Width="{Binding MainWindowCenterColumnWidth, Mode=TwoWay, Source={x:Static prop:Settings.Default}}" MinWidth="300" MaxWidth="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}, Path=CenterColumnMaxWidth, Mode=OneWay}"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition x:Name="rightColumn" Width="*" MinWidth="500"/>
</Grid.ColumnDefinitions>
<StackPanel x:Name="leftPanel" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0"/>
<GridSplitter x:Name="leftSplitter" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Stretch" ResizeBehavior="PreviousAndNext" Width="5" ResizeDirection="Columns"/>
<StackPanel x:Name="centerPanel" Grid.Column="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0"/>
<GridSplitter x:Name="rightSplitter" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Stretch" ResizeBehavior="PreviousAndNext" Width="5" ResizeDirection="Columns"/>
<StackPanel x:Name="rightPanel" Grid.Column="4" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0" SizeChanged="rightPanel_SizeChanged"/>
</Grid>
我有双型两种LeftColumnMaxWidth和CenterColumnMaxWidth的依赖属性。而rightPanel_SizeChanged处理程序以及窗口加载处理程序都调用这个方法:
private void CalculateMaxWidths()
{
FrameworkElement content = Content as FrameworkElement;
if (content != null)
{
LeftColumnMaxWidth = content.ActualWidth
- leftSplitter.ActualWidth
- centerColumn.ActualWidth
- rightSplitter.ActualWidth
- rightColumn.MinWidth;
CenterColumnMaxWidth = content.ActualWidth
- leftColumn.ActualWidth
- leftSplitter.ActualWidth
- rightSplitter.ActualWidth
- rightColumn.MinWidth;
}
}
我还有一些工作要做,以确保调整窗口的大小不夹右侧立柱。我认为这个解决方案可能与试图让分离器按比例分配有关。我目前设置的特别特殊的行为是,左分离器调整左右列的大小,并固定中心列的大小。
我不害怕处理SizeChanged或DragDelta来实现我的目标。但是我相信我不能做的事情实际上是设置前两列的Width属性,因为这会破坏我绑定到保存状态的用户设置。
非常感谢您的帮助。