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.

2voto

JohnForDummies Punkte 920

Matt - um den WindowState als Benutzereinstellung zu speichern, blättern Sie im Einstellungsdialog in der Dropdown-Liste "Typ" nach unten und wählen Sie "Durchsuchen".

Erweitern Sie im Dialogfeld "Select a Type" System.Windows.Forms und wählen Sie "FormWindowState" als Typ.

(Entschuldigung, ich sehe keine Schaltfläche, die es mir erlaubt, den Kommentar zu kommentieren...)

1 Stimmen

Nochmals, es tut mir leid, ich kann dem anderen Thread keinen Kommentar hinzufügen... Aber Matt, indem Sie die Position des Formulars festlegen, wird es auf den richtigen Bildschirm verschoben, und dann können Sie den WindowState auf Maximized usw. setzen, und es wird auf dem richtigen Bildschirm sein.

2voto

Wenn Sie mehr als 1 Formular haben, können Sie etwas wie dieses verwenden...

Fügen Sie diesen Teil alle Form Last ungültig

var AbbA = Program.LoadFormLocationAndSize(this);
            this.Location = new Point(AbbA[0], AbbA[1]);
            this.Size = new Size(AbbA[2], AbbA[3]);
            this.FormClosing += new FormClosingEventHandler(Program.SaveFormLocationAndSize);

Speicherort und Größe des Formulars in app.config xml speichern

public static void SaveFormLocationAndSize(object sender, FormClosingEventArgs e)
{
    Form xForm = sender as Form;
    Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
    if (ConfigurationManager.AppSettings.AllKeys.Contains(xForm.Name))
        config.AppSettings.Settings[xForm.Name].Value = String.Format("{0};{1};{2};{3}", xForm.Location.X, xForm.Location.Y, xForm.Size.Width, xForm.Size.Height);
    else
        config.AppSettings.Settings.Add(xForm.Name, String.Format("{0};{1};{2};{3}", xForm.Location.X, xForm.Location.Y, xForm.Size.Width, xForm.Size.Height));
    config.Save(ConfigurationSaveMode.Full);
}

Speicherort und Größe des Formulars aus app.config xml laden

public static int[] LoadFormLocationAndSize(Form xForm)
{
    int[] LocationAndSize = new int[] { xForm.Location.X, xForm.Location.Y, xForm.Size.Width, xForm.Size.Height };
    //---//
    try
    {
        Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
        var AbbA = config.AppSettings.Settings[xForm.Name].Value.Split(';');
        //---//
        LocationAndSize[0] = Convert.ToInt32(AbbA.GetValue(0));
        LocationAndSize[1] = Convert.ToInt32(AbbA.GetValue(1));
        LocationAndSize[2] = Convert.ToInt32(AbbA.GetValue(2));
        LocationAndSize[3] = Convert.ToInt32(AbbA.GetValue(3));
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    //---//
    return LocationAndSize;
}

1voto

Ian Punkte 32230

Sie müssen die Informationen manuell irgendwo speichern. Ich würde vorschlagen, dies als Anwendungseinstellungen zu tun und sie in einem benutzerspezifischen isolierten Speicher zu speichern.

Lesen Sie nach dem Laden die Einstellungen und ändern Sie dann die Größe bzw. verschieben Sie Ihr Formular.

1voto

sashoalm Punkte 68243

Meine Antwort stammt aus ChrisFs Antwort aber ich habe eine Sache behoben, die mir nicht gefiel - wenn das Fenster beim Schließen minimiert ist, erscheint es beim nächsten Start minimiert.

Mein Code behandelt diesen Fall korrekt, indem er sich merkt, ob das Fenster zum Zeitpunkt seiner Minimierung maximiert oder normal war, und den dauerhaften Zustand entsprechend einstellt.

Leider stellt Winforms diese Informationen nicht direkt zur Verfügung, so dass ich WndProc überschreiben und die Informationen selbst speichern musste. Siehe Prüfen, ob das aktuell minimierte Fenster zum Zeitpunkt der Minimierung maximiert oder normal war

partial class Form1 : Form
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_SYSCOMMAND)
        {
            int wparam = m.WParam.ToInt32() & 0xfff0;

            if (wparam == SC_MAXIMIZE)
                LastWindowState = FormWindowState.Maximized;
            else if (wparam == SC_RESTORE)
                LastWindowState = FormWindowState.Normal;
        }

        base.WndProc(ref m);
    }

    private const int WM_SYSCOMMAND = 0x0112;
    private const int SC_MAXIMIZE = 0xf030;
    private const int SC_RESTORE = 0xf120;
    private FormWindowState LastWindowState;

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (WindowState == FormWindowState.Normal)
        {
            Properties.Settings.Default.WindowLocation = Location;
            Properties.Settings.Default.WindowSize = Size;
        }
        else
        {
            Properties.Settings.Default.WindowLocation = RestoreBounds.Location;
            Properties.Settings.Default.WindowSize = RestoreBounds.Size;
        }

        if (WindowState == FormWindowState.Minimized)
        {
            Properties.Settings.Default.WindowState = LastWindowState;
        }
        else
        {
            Properties.Settings.Default.WindowState = WindowState;
        }

        Properties.Settings.Default.Save();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        if (Properties.Settings.Default.WindowSize != new Size(0, 0))
        {
            Location = Properties.Settings.Default.WindowLocation;
            Size = Properties.Settings.Default.WindowSize;
            WindowState = Properties.Settings.Default.WindowState;
        }
    }

1voto

Deniz Punkte 421

Sie könnten es auch in Ihrer config.xml speichern, wenn Sie das Formular schließen:

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    XmlDocument docConfigPath = new XmlDocument();
    docConfigPath.Load(XML_Config_Path);

    WriteNode(new string[] { "config", "Size", "Top", Top.ToString() }, docConfigPath);
    WriteNode(new string[] { "config", "Size", "Left", Left.ToString() }, docConfigPath);
    WriteNode(new string[] { "config", "Size", "Height", Height.ToString() }, docConfigPath);
    WriteNode(new string[] { "config", "Size", "Width", Width.ToString() }, docConfigPath);

    docConfigPath.Save(XML_Config_Path);
}

public static XmlNode WriteNode(string[] sNode, XmlDocument docConfigPath)
{
    int cnt = sNode.Length;
    int iNode = 0;
    string sNodeNameLast = "/" + sNode[0];
    string sNodeName = "";
    XmlNode[] xN = new XmlNode[cnt];

    for (iNode = 1; iNode < cnt - 1; iNode++)
    {
        sNodeName = "/" + sNode[iNode];
        xN[iNode] = docConfigPath.SelectSingleNode(sNodeNameLast + sNodeName);
        if (xN[iNode] == null)
        {
            xN[iNode] = docConfigPath.CreateNode("element", sNode[iNode], "");
            xN[iNode].InnerText = "";
            docConfigPath.SelectSingleNode(sNodeNameLast).AppendChild(xN[iNode]);
        }
        sNodeNameLast += sNodeName;
    }

    if (sNode[cnt - 1] != "")
        xN[iNode - 1].InnerText = sNode[cnt - 1];

    return xN[cnt - 2];
}

Und das Laden geht auf Ihre Rechnung:

private void Form1_Load(object sender, EventArgs e)
{
    XmlDocument docConfigPath = new XmlDocument();
    docConfigPath.Load(XML_Config_Path);
    XmlNodeList nodeList = docConfigPath.SelectNodes("config/Size");

    Height = ReadNodeInnerTextAsNumber("config/Size/Height", docConfigPath);
    Width = ReadNodeInnerTextAsNumber("config/Size/Width", docConfigPath);
    Top = ReadNodeInnerTextAsNumber("config/Size/Top", docConfigPath);
    Left = ReadNodeInnerTextAsNumber("config/Size/Left", docConfigPath);
}

Die config.xml sollte folgendes enthalten:

<?xml version="1.0" encoding="utf-8"?>
<config>
  <Size>
    <Height>800</Height>
    <Width>1400</Width>
    <Top>100</Top>
    <Left>280</Left>
  </Size>
</config>

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