Я создаю пользовательский интерфейс с 3 столбцами с разделителями сетки между столбцами. У меня есть требование сохранить состояние столбцов, чтобы, если пользователь закроет и снова откроет приложение, оно будет выглядеть так, как будто они его оставили. Но я также пытаюсь разделить столбцы пропорционально - я имею в виду, что если вы растянете окно, все три панели будут расти, а если вы переместите левый разделитель, это изменит разделение между левым и центральным столбцами.
То, что у меня есть на данный момент, удовлетворяет только первому требованию - сохраняет состояние ширины столбцов. Я также установил для столбцов минимальную ширину для всех трех столбцов. Но, насколько я понимаю, способ указать разделителю разделить пропорционально - это использовать ширину столбцов размером со звезду. Поскольку я уже использую свойство 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>
У меня есть свойства зависимости типа double для LeftColumnMaxWidth и CenterColumnMaxWidth. И обработчик rightPanel_SizeChanged, и обработчик окна Loaded вызывают этот метод:
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 первых двух столбцов, так как это разрушило бы мою привязку к пользовательской настройке, сохраняющей состояние.
Заранее благодарим вас за любую помощь.