我正在用列間的網格分隔符創建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屬性,因爲這會破壞我綁定到保存狀態的用戶設置。
非常感謝您的幫助。