Feedback

C# - Autom. Laden & Speichern von Position und Größe eines Forms

Veröffentlicht von am 06.12.2007
(1 Bewertungen)
Oftmals möchte man das Hauptfenster seiner Anwendung beim Start so wieder vorfinden, wie man es verlassen hat.

Diese Component-Klasse kann das Laden und Speichern von Größe, Position und Zustand (WindowState) eines Forms übernehmen. Dazu zieht man diese Komponente aus der ToolBox in den Designer und stellt das Property "FormToSave" auf die zu speichernde Form. Über den Designer lässt sich auch einstellen was gespeichert werden soll.

Die Daten werden automatisch in einer XML-Datei beim Verlassen der Form (FormClosing-Event) im lokalen Applikationspfad (LocalUserAppDataPath) gespeichert. Beim nächsten Programmstart wird beim Erstellen der Form (Loading-Event) die Daten wieder eingelesen und angewendet.
GFU-Schulungen  [Anzeige]

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

C# 2017/2015/2013 Aufbau

In dieser Schulung lernen Sie fortgeschrittene Techniken im Bereich .Net C#. Dabei stehen neben den eigentlichen Techniken auch architektonische Aspekte im Mittelpunkt.

using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using System.Xml;

namespace Kosmo
{
    public class FormStateSaver : Component
    {
        private Form form;
        private bool saveSize = true;
        private bool saveLocation = true;
        private bool saveWindowState = true;

        public Form FormToSave
        {
            get { return form; }
            set
            {
                RemoveEventsFromForm();
                form = value;
                AddEventsToForm();
            }
        }

        [DefaultValue(true)]
        public bool SaveSize
        {
            get { return saveSize; }
            set { saveSize = value; }
        }

        [DefaultValue(true)]
        public bool SaveLocation
        {
            get { return saveLocation; }
            set { saveLocation = value; }
        }

        [DefaultValue(true)]
        public bool SaveWindowState
        {
            get { return saveWindowState; }
            set { saveWindowState = value; }
        }

        private void AddEventsToForm()
        {
            if (!DesignMode && form != null)
            {
                form.Load += Form_Load;
                form.FormClosing += Form_FormClosing;
            }
        }

        private void RemoveEventsFromForm()
        {
            if (!DesignMode && form != null)
            {
                form.Load -= Form_Load;
                form.FormClosing -= Form_FormClosing;
            }
        }

        private void Form_Load(object sender, EventArgs e)
        {
            LoadFormState();
        }

        private void Form_FormClosing(object sender, EventArgs e)
        {
            SaveFormState();
        }

        protected string GetXmlPath()
        {
            return Path.Combine(Application.LocalUserAppDataPath, form.Name + ".xml");
        }

        public void LoadFormState()
        {
            if (form == null || (!saveLocation && !saveSize && !saveWindowState))
                return;

            string path = GetXmlPath();
            if (File.Exists(path))
            {
                XmlDocument xml = new XmlDocument();
                xml.Load(path);
                if (xml["Form"] != null)
                {
                    XmlNode root = xml["Form"];
                    if (saveWindowState && root["WindowState"] != null)
                    {
                        form.WindowState = (FormWindowState)Enum.Parse(typeof(FormWindowState), root["WindowState"].InnerText);
                    }
                    if (saveLocation && root["Location"] != null)
                    {
                        if (root["Location"]["X"] != null)
                            form.Left = Convert.ToInt32(root["Location"]["X"].InnerText);
                        if (root["Location"]["Y"] != null)
                            form.Top = Convert.ToInt32(root["Location"]["Y"].InnerText);
                    }
                    if (saveSize && root["Size"] != null)
                    {
                        if (root["Size"]["Width"] != null)
                            form.Width = Convert.ToInt32(root["Size"]["Width"].InnerText);
                        if (root["Size"]["Height"] != null)
                            form.Height = Convert.ToInt32(root["Size"]["Height"].InnerText);
                    }
                }
            }
        }

        public void SaveFormState()
        {
            if (form == null || (!saveLocation && !saveSize && !saveWindowState))
                return;

            XmlDocument xml = new XmlDocument();
            XmlNode root = xml.AppendChild(xml.CreateElement("Form"));
            Rectangle bounds = form.Bounds;
            if (form.WindowState != FormWindowState.Normal)
            {
                bounds = form.RestoreBounds;
            }
            if (saveLocation)
            {
                XmlNode loc = root.AppendChild(xml.CreateElement("Location"));
                loc.AppendChild(xml.CreateElement("X")).InnerText = bounds.X.ToString();
                loc.AppendChild(xml.CreateElement("Y")).InnerText = bounds.Y.ToString();
            }
            if (saveSize)
            {
                XmlNode size = root.AppendChild(xml.CreateElement("Size"));
                size.AppendChild(xml.CreateElement("Width")).InnerText = bounds.Width.ToString();
                size.AppendChild(xml.CreateElement("Height")).InnerText = bounds.Height.ToString();
            }
            if (saveWindowState)
            {
                root.AppendChild(xml.CreateElement("WindowState")).InnerText = form.WindowState.ToString();
            }
            xml.Save(GetXmlPath());
        }
    }
}

2 Kommentare zum Snippet

tobi3333 schrieb am 12.03.2012:
Um auch mit 2 Monitoren kompatibel zu sein, sollte in der LoadFormState-Methode das setzten des WindowsStates nach dem setzten der Postion geschehen. Andernfalls wird immer auf dem ersten Monitor maximiert.
dariusarnold schrieb am 27.12.2012:
Das kann man aber auch kürzer haben...
 

Logge dich ein, um hier zu kommentieren!