WPF GridSplitter - salvando e restaurando o local E dividindo proporcionalmente
Estou criando uma interface do usuário de 3 colunas com divisores de grade entre as colunas. Eu tenho o requisito de salvar o estado das colunas para que, se o usuário fechar e reabrir o aplicativo, ele se parecer com o que ele deixou. Mas também estou tentando fazer com que as colunas se dividam proporcionalmente - ou seja, se você esticar a janela, todos os três painéis crescem e se você mover o divisor esquerdo, ele altera a divisão entre as colunas esquerda e central.
O que tenho atualmente alcança apenas o primeiro requisito - ele salva o estado das larguras da coluna. Também fiz com que as colunas aplicassem larguras mínimas para as três colunas. Mas, pelo que entendi, a maneira de dizer a um divisor para dividir proporcionalmente é usar larguras de coluna do tamanho de estrelas. Como já estou usando a propriedade Width para salvar e restaurar o estado, não tenho certeza de que posso realizar o que quero.
Alguém conseguiu salvar o estado das larguras da coluna E a divisão é proporcional?
Aqui está um código para o que eu tenho atualmente:
<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>
Eu tenho propriedades de dependência do tipo double para LeftColumnMaxWidth e CenterColumnMaxWidth. E o manipulador rightPanel_SizeChanged, bem como o manipulador de janela Loaded, chamam este método:
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;
}
}
Ainda tenho algum trabalho a fazer para garantir que o redimensionamento da janela não corte a coluna da direita. Eu acho que essa solução pode estar relacionada à tentativa de dividir os divisores proporcionalmente. O comportamento particularmente peculiar da minha configuração atual é que o divisor esquerdo redimensiona as colunas esquerda e direita e deixa o tamanho da coluna central fixo.
Não tenho medo de lidar com SizeChanged ou DragDelta para atingir meus objetivos. Mas o que eu acredito que não posso fazer é realmente definir a propriedade Width das duas primeiras colunas, pois isso destruiria minha ligação à configuração do usuário que salva o estado.
Obrigado desde já por qualquer ajuda.