У меня есть решение для сохранения размера и состояния, вы можете продлить его, чтобы сохранить позицию. Это делается с помощью Поведения. Просто привязка ширины и высоты не работала должным образом, поскольку она перезаписывала размер «нормального» состояния с максимальными размерами. Вот почему есть некоторые дополнительные проверки, такие как if(state == normal)
Существует Config
Недвижимость на моем окне DataContext
. Для этого вам понадобится ссылка на System.Windows.Interactivity
.
public class MainWindowSaveStateBehavior : Behavior<Window>
{
public Config Config
{
get { return (Config)GetValue(ConfigProperty); }
set { SetValue(ConfigProperty, value); }
}
public static readonly DependencyProperty ConfigProperty =
DependencyProperty.Register("Config", typeof(Config), typeof(MainWindowSaveStateBehavior), new PropertyMetadata(Config_Changed));
private static void Config_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var b = d as MainWindowSaveStateBehavior;
if(e.NewValue != null) b.LoadSettings();
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SizeChanged += Window_SizeChanged;
AssociatedObject.StateChanged += Window_StateChanged;
LoadSettings();
}
bool _initialized = false;
private void Window_StateChanged(object sender, EventArgs e)
{
SaveSettings();
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
SaveSettings();
}
private void LoadSettings()
{
if (Config == null) return;
AssociatedObject.Width = Config.WindowWidth;
AssociatedObject.Height = Config.WindowHeight;
AssociatedObject.WindowState = Config.WindowState;
_initialized = true;
}
private void SaveSettings()
{
if (Config == null || !_initialized) return;
Config.WindowState = AssociatedObject.WindowState;
if(AssociatedObject.WindowState == WindowState.Normal)
{
Config.WindowWidth = AssociatedObject.Width;
Config.WindowHeight = AssociatedObject.Height;
}
}
}
В Xaml использовать поведение путем добавления пространств имен
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:b="<the namespace your behavior lives in>"
И затем присоедините поведение
<i:Interaction.Behaviors>
<b:MainWindowSaveStateBehavior Config="{Binding Config}" />
</i:Interaction.Behaviors>
Затем вы просто должны загрузить и сохранить конфиг в вашем DataContext при запуске /неисправность.
Важное значение имеет положение максимизированного окна: на каком мониторе он максимизировался? –
Отличный пункт. Но, вероятно, лучше сохранить идентификатор монитора и максимизированное состояние, а не максимизировать границы, так или иначе, если разрешение изменится. – Josh