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, se vea como lo dejaron. Pero también estoy tratando de hacer que las columnas se dividan proporcionalmente, con lo que quiero decir que si estira la ventana, los tres paneles crecen y si mueve el divisor izquierdo cambia la división entre las columnas izquierda y central.WPF GridSplitter - guardar y restaurar la ubicación AND dividir proporcionalmente
Lo que tengo actualmente solo alcanza el primer requisito: guarda el estado de los anchos de columna. También hice que las columnas imponen anchuras mínimas 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. Dado que ya estoy usando la propiedad Width 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 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 tanto para LeftColumnMaxWidth y CenterColumnMaxWidth. Y el manejador rightPanel_SizeChanged así como el manejador de ventana Cargado tanto 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 tienen mucho trabajo por hacer para asegurarse de que el cambio de tamaño de la ventana no recorta la columna de la 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 configurar 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.