WPF GridSplitter - сохранение и восстановление местоположения И пропорциональное разделение

Я создаю пользовательский интерфейс с 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 первых двух столбцов, так как это разрушило бы мою привязку к пользовательской настройке, сохраняющей состояние.

Заранее благодарим вас за любую помощь.

12
задан dinane 16 February 2011 в 15:45
поделиться