我正在创建一个有3个列的UI,并在列之间使用网格分隔器。我的要求是保存列的状态,以便用户关闭并重新打开应用程序时,应用程序的外观与他们离开时一样。但我还尝试让这3个列按比例划分 - 也就是说,如果拉伸窗口,则所有三个面板都会增长;如果移动左边的分隔器,它会改变左列和中间列之间的分割。
目前我只实现了第一个要求 - 它保存了列宽的状态。我还为所有三列强制设定了最小宽度。但是据我所知,告诉分隔器按比例划分的方法是使用星号大小的列宽。由于我已经在使用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>
我有两个类型为double的依赖属性:LeftColumnMaxWidth和CenterColumnMaxWidth。右面板大小更改处理程序以及窗口加载处理程序都调用此方法:
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 以实现我的目标。但我相信我不能真正设置前两列的宽度属性,因为那样会破坏我与用户设置保存状态的绑定。
非常感谢任何帮助。