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.

questionAnswers(1)

yourAnswerToTheQuestion