A maneira padrão de resolver isso é usar arquivos de configurações. O problema com os arquivos de configurações é que você precisa definir todas as configurações e escrever o código que copia os dados para frente e para trás você mesmo. Bastante entediante se você tiver muitas propriedades para controlar.
Eu fiz uma biblioteca bastante flexível e fácil de usar para isso, você apenas informa quais propriedades de qual objeto rastrear e ela faz o resto. Você também pode configurar a porcaria se quiser.
A biblioteca é chamada Jot (github) , aqui está um antigo artigo CodeProject que escrevi sobre ela.
Veja como você pode usá-lo para controlar o tamanho e a localização de uma janela:
public MainWindow()
{
InitializeComponent();
_stateTracker.Configure(this)
.IdentifyAs("MyMainWindow")
.AddProperties(nameof(Height), nameof(Width), nameof(Left), nameof(Top), nameof(WindowState))
.RegisterPersistTrigger(nameof(Closed))
.Apply();
}
Arquivos Jot vs. configurações: Com Jot há consideravelmente menos código e é muito menos sujeito a erros, pois você só precisa mencionar cada propriedade uma vez . Com os arquivos de configuração, você precisa mencionar cada propriedade 5 vezes : uma vez ao criar explicitamente a propriedade e mais quatro vezes no código que copia os valores de um lado para outro.
Armazenamento, serialização etc. são totalmente configuráveis. Além disso, ao usar o IOC, você pode até conectá-lo para que aplique o rastreamento automaticamente a todos os objetos que ele resolve, de modo que tudo o que você precisa fazer para tornar uma propriedade persistente é inserir um atributo [Trackable] nela.
Estou escrevendo tudo isso porque acho que a biblioteca é excelente e quero falar sobre isso.