54 Stimmen

.NET / Windows Forms: Fenstergröße und -position merken

Ich habe eine Windows Forms-Anwendung mit einem normalen Fenster. Wenn ich nun die Anwendung schließe und neu starte, möchte ich, dass das Hauptfenster an der gleichen Stelle auf meinem Bildschirm mit der gleichen Größe erscheint, wie zum Zeitpunkt des Schließens.

Gibt es in Windows Forms eine einfache Möglichkeit, sich die Position des Bildschirms und die Fenstergröße (und wenn möglich den Fensterstatus) zu merken, oder muss alles von Hand gemacht werden?

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.

0voto

oscilatingcretin Punkte 9907

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X