WPF GridSplitter: guardar y restaurar la ubicación Y dividirla proporcionalmente

Estoy creando una interfaz de usuario de 3 columnas con divisores de cuadrícula entre las columnas. Tengo el requisito de guardar el estado de las columnas para que si el usuario cierra y vuelve a abrir la aplicación, parece que la dejaron. Pero también estoy tratando de hacer que las columnas se dividan proporcionalmente, es decir, si estira la ventana, los tres paneles crecen y si mueve el divisor izquierdo, cambia la división entre las columnas izquierda y central.

Lo que tengo actualmente solo alcanza el primer requisito: guarda el estado de los anchos de columna. También hice que las columnas impongan anchos mínimos para las tres columnas. Pero, según tengo entendido, la forma de decirle a un divisor que se divida proporcionalmente es usar anchos de columna del tamaño de una estrella. Como ya estoy usando la propiedad Ancho para guardar y restaurar el estado, no estoy seguro de poder lograr lo que quiero.

¿Alguien ha logrado guardar el estado de los anchos de columna Y hacer que la división sea proporcional?

Aquí hay un código para lo que tengo actualmente:

   <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>

Tengo propiedades de dependencia de tipo double para LeftColumnMaxWidth y CenterColumnMaxWidth. Y el controlador rightPanel_SizeChanged, así como el controlador Loaded de ventana, llaman a 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;
          }
    }

Todavía tengo trabajo por hacer para asegurarme de que cambiar el tamaño de la ventana no recorta la columna derecha. Creo que esa solución puede estar relacionada con tratar de hacer que los divisores se dividan proporcionalmente. El comportamiento particularmente peculiar de mi configuración actual es que el divisor izquierdo cambia el tamaño de las columnas izquierda y derecha, y deja fijo el tamaño de la columna central.

No tengo miedo de manejar SizeChanged o DragDelta para lograr mis objetivos. Pero lo que creo que no puedo hacer es establecer la propiedad Ancho de las dos primeras columnas, ya que eso destruiría mi enlace a la configuración del usuario que guarda el estado.

Gracias de antemano por cualquier ayuda

Respuestas a la pregunta(1)

Su respuesta a la pregunta