Так что я думаю, что понял это.Возможно, что некоторые старые значения в моих settings.settings вызывали у меня проблемы, и возможно, что значения по умолчанию, которые я ввел, вызывали у меня проблемы.Но вот что я сделал:
- Изменил мои пользовательские настройки, чтобы сохранить все три (а не только два левых) ширины столбца.И сохраните их как строки.
- Установите значение по умолчанию в пользовательских настройках (а также свойство width в столбцах) на что-то вроде 200 *.
- Установите только MinWidth - не максимум- для всех трех столбцов.
- Вручную загрузите и сохраните пользовательские настройки для столбцов с помощью GridLengthConverter.
Я не уверен на 100%, что это лучший способ, но этокажется, работает, что делает меня вполне счастливым.В случае, если кто-то еще столкнется с проблемой и столкнется с этим сообщением, вот рабочий XAML:
<Grid x:Name="mainGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="leftColumn" MinWidth="200" Width="200*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition x:Name="centerColumn" MinWidth="300" Width="300*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition x:Name="rightColumn" MinWidth="498" Width="498*"/>
</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>
Событие с измененным размером все еще существует только для трассировки отладки.Я вывожу значения ширины, чтобы увидеть, что происходит.Любопытно, что после расширения всего и возврата к минимальному размеру окна ширина правого столбца остается большей.Но так как все они имеют минимальную ширину, а ширины имеют размер звезды, это работает само собой.
Я попытался вернуть это обратно в привязку, но так как я сейчас храню строку, и GridLengthConverterявляется TypeConverter, а не IValueConverter, он не работал.Я думаю, что возможно сохранить значения как GridLengths, хотя я достиг точки, когда я доволен тем, что сделал.Таким образом, моя загрузка и сохранение выглядят так:
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
//...
try
{
GridLengthConverter converter = new GridLengthConverter();
leftColumn.Width = (GridLength)converter.ConvertFromString(Settings.Default.MainWindowLeftColumnWidth);
centerColumn.Width = (GridLength)converter.ConvertFromString(Settings.Default.MainWindowCenterColumnWidth);
rightColumn.Width = (GridLength)converter.ConvertFromString(Settings.Default.MainWindowRightColumnWidth);
Trace.WriteLine(string.Format("LOADED Left: {0}, Center: {1}, Right {2}", leftColumn.Width, centerColumn.Width, rightColumn.Width));
}
catch (Exception)
{
// Fail silently, the worse case is we go with the defaults, it's going to be okay
}
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
base.OnClosing(e);
//...
try
{
GridLengthConverter converter = new GridLengthConverter();
Settings.Default.MainWindowLeftColumnWidth = converter.ConvertToString(leftColumn.Width);
Settings.Default.MainWindowCenterColumnWidth = converter.ConvertToString(centerColumn.Width);
Settings.Default.MainWindowRightColumnWidth = converter.ConvertToString(rightColumn.Width);
Trace.WriteLine(string.Format("SAVED Left: {0}, Center: {1}, Right {2}", Settings.Default.MainWindowLeftColumnWidth, Settings.Default.MainWindowCenterColumnWidth, Settings.Default.MainWindowRightColumnWidth));
}
catch (Exception)
{
// Fail silently, the worst case is we don't save a little something, it's going to be okay
}
}
И это все работает для меня.Так что я собираюсь пойти с этим!
РЕДАКТИРОВАТЬ: я позже сделал некоторые уточнения, чтобы предотвратить "любопытство" правой колонки, оставаясь больше.У меня теперь все изменения размера панели идут в один обработчик событий:
private void PanelSizeChanged(object sender, SizeChangedEventArgs e)
{
// In order to keep the resizing from losing proportionality, we'll force it to be proportional to the current size.
// Otherwise the right panel edges up and up while the other two remain at their starting 200*/300* values.
// And when that happens eventually resizing the window only resizes the right panel, not proportionately as it does at the start.
leftColumn.Width = new GridLength(leftColumn.ActualWidth, GridUnitType.Star);
centerColumn.Width = new GridLength(centerColumn.ActualWidth, GridUnitType.Star);
rightColumn.Width = new GridLength(rightColumn.ActualWidth, GridUnitType.Star);
}