Ich habe diese Methode bisher angewandt, und sie hat sich bewährt. Sie müssen nicht mit den Einstellungen der Anwendung herumfummeln. Stattdessen wird mittels Serialisierung eine Einstellungsdatei in das Arbeitsverzeichnis geschrieben. Ich verwende JSON, aber Sie können die .NET-eigene XML-Serialisierung oder eine beliebige Serialisierung verwenden.
Fügen Sie diese statischen Methoden in eine gemeinsame Erweiterungsklasse ein. Bonuspunkte, wenn Sie ein gemeinsames Erweiterungsprojekt haben, auf das Sie in mehreren Projekten verweisen:
const string WINDOW_STATE_FILE = "windowstate.json";
public static void SaveWindowState(Form form)
{
var state = new WindowStateInfo
{
WindowLocation = form.Location,
WindowState = form.WindowState
};
File.WriteAllText(WINDOW_STATE_FILE, JsonConvert.SerializeObject(state));
}
public static void LoadWindowState(Form form)
{
if (!File.Exists(WINDOW_STATE_FILE)) return;
var state = JsonConvert.DeserializeObject<WindowStateInfo>(File.ReadAllText(WINDOW_STATE_FILE));
if (state.WindowState.HasValue) form.WindowState = state.WindowState.Value;
if (state.WindowLocation.HasValue) form.Location = state.WindowLocation.Value;
}
public class WindowStateInfo
{
public FormWindowState? WindowState { get; set; }
public Point? WindowLocation { get; set; }
}
Sie brauchen diesen Code nur einmal zu schreiben und nie wieder zu verändern. Jetzt kommt der lustige Teil: Fügen Sie den unten stehenden Code in das Formular ein Load
y FormClosing
Ereignisse wie diese:
private void Form1_Load(object sender, EventArgs e)
{
WinFormsGeneralExtensions.LoadWindowState(this);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
WinFormsGeneralExtensions.SaveWindowState(this);
}
Das ist alles, was Sie tun müssen. Das einzige, was Sie tun müssen, ist, diese Erweiterungen in eine gemeinsame Klasse zu integrieren. Danach müssen Sie nur noch zwei Codezeilen in den Code Ihres Formulars einfügen und fertig.
Dieser Code funktioniert nur, wenn Ihre WinForm-Anwendung ein einziges Formular enthält. Wenn sie mehrere Formulare hat, deren Positionen Sie sich merken wollen, müssen Sie kreativ werden und etwas wie das hier tun:
public static void SaveWindowState(Form form)
{
var state = new WindowStateInfo
{
WindowLocation = form.Location,
WindowState = form.WindowState
};
File.WriteAllText($"{form.Name} {WINDOW_STATE_FILE}", JsonConvert.SerializeObject(state));
}
Ich speichere nur Ort und Status, aber Sie können dies ändern, um Höhe und Breite des Formulars oder etwas anderes zu speichern. Nehmen Sie die Änderung nur einmal vor und sie wird für jede Anwendung funktionieren, die sie aufruft.
2 Stimmen
Diese Frage wurde schon einmal gestellt und hier beantwortet: (Es ist eine gute Antwort. Stellen Sie sicher, dass Sie @Joe ein Upvote geben, wenn Sie sie verwenden.) Es ist keine exakte Kopie - diese Person hat nicht nach der Fenstergröße gefragt, aber Sie sollten in der Lage sein, von dort zu extrapolieren. stackoverflow.com/questions/105932/
0 Stimmen
Habe meinen Kommentar zusammen mit Ihrem Beitrag gelöscht... doh. Ich bin anderer Meinung, da die Lösung einen UserPreferencesManager verwendet, der, soweit ich weiß, eine benutzerdefinierte Klasse ist. Ich glaube, die Frage ist, wie Sie eine solche UserPreferencesManager-Klasse implementieren würden.
1 Stimmen
Bitte beachten Sie, dass, wenn der Benutzer eine variable Bildschirmgröße hat (z.B. wenn er manchmal einen Monitor an die nb anschließt oder eine Remote-Verbindung mit unterschiedlicher Bildschirmgröße herstellt), dieser Versuch zu einem frustrierenden Zustand führen kann, wenn Ihre Anwendung außerhalb des Bildschirmrahmens erscheint. Prüfen Sie stackoverflow.com/questions/105932/ für komplexere Lösungen.