列間にグリッド スプリッターがある 3 列の UI を作成しています。列の状態を保存して、ユーザーがアプリを閉じて再度開いた場合に、アプリを離れたように見えるようにする必要があります。しかし、列を比例して分割しようとしています。つまり、ウィンドウを引き伸ばすと、3 つのパネルすべてが拡大し、左側のスプリッターを移動すると、左側と中央の列の間の分割が変更されます。
私が現在持っているものは、最初の要件のみを達成しています-列幅の状態を保存します。また、列が 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>
LeftColumnMaxWidth と CenterColumnMaxWidth の両方に double 型の依存関係プロパティがあります。そして、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 を処理することを恐れていません。しかし、私ができないと思うのは、最初の 2 つの列の Width プロパティを実際に設定することです。これは、状態を保存するユーザー設定へのバインディングを破壊するからです。
よろしくお願いします。