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