AdSense

Mittwoch, 17. Juli 2013

C# Windows Forms bzw. WPF - Fensterposition und Größe beibehalten

(English version) Es kann ziemlich praktisch sein, wenn bei einem Neustart der Anwendung jedes Fenster wieder seine Größe und Position hat. Dafür habe ich in C# eine eigene Klasse geschrieben: SizeSavedWindow. Der Quellcode für diese Klasse ist ganz unten im Post. Um nun ein Fenster genau an seiner Position zu halten muss hinter InitializeComponent(); einfach die folgende Zeile eingefügt werden:

SizeSavedWindow.addToSizeSavedWindows(this);

Diese Funktion kann auch für viele verschiedene Fenster aufgerufen werden, die Fenster werden per Name in die xml-Datei gespeichert, wenn es also keine Fenster mit gleichem Namen gibt klappt alles wie es soll. Diese Klasse gibt es auch für WPF Windows, dafür muss jedes "Form" durch "Window" ersetzt werden und auch die Events müssen etwas überarbeitet werden (window_IsVisibleChanged statt window_Shown). Falls jemand Interesse an dem Code für WPF hat kann ich den auch noch posten. Im Anschluss nun den Code für die Klasse SizeSavedWindow (der Namespace muss natürlich noch an das jeweilige Projekt angepasst werden):

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Runtime.Serialization;
using System.Xml;
using System.Windows.Forms;

namespace KeepSizeTest1
{
    public class SizeSavedWindow
    {
        // To keep a window at the same size and position, just add
        // SizeSavedWindow.addToSizeSavedWindows(this);
        // right after initialieComponent
        public static void addToSizeSavedWindows(Form window)
        {
            window.Shown += window_Shown;
        }

        static void window_Shown(object sender, EventArgs e)
        {
            Form window = (Form)sender;
            if (!window.Visible)
            {
                return;
            }
            if (File.Exists("sizes.xml"))
            {
                var stream = new FileStream("sizes.xml", FileMode.Open);
                var reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas());
                var deserializer = new DataContractSerializer(typeof(Dictionary<string, int[]>));
                windows = (Dictionary<string, int[]>)deserializer.ReadObject(reader, true);
                stream.Close();

                foreach (KeyValuePair<string, int[]> pair in windows)
                {
                    if (pair.Key == window.Name)
                    {
                        window.Height = pair.Value[0];
                        window.Width = pair.Value[1];
                        window.Top = pair.Value[2];
                        window.Left = pair.Value[3];
                        break;
                    }
                }
            }
            int[] sizes = new int[4];
            sizes[0] = window.Height;
            sizes[1] = window.Width;
            sizes[2] = window.Top;
            sizes[3] = window.Left;
            if (windows.ContainsKey(window.Name))
            {
                windows.Remove(window.Name);
            }
            windows.Add(window.Name, sizes);
            window.SizeChanged += window_SizeChanged;
            window.LocationChanged += window_LocationChanged;
        }

        static void window_SizeChanged(object sender, EventArgs e)
        {
            Form realSender = (Form)sender;
            if (windows.ContainsKey(realSender.Name))
            {
                windows[realSender.Name][0] = realSender.Height;
                windows[realSender.Name][1] = realSender.Width;

                var writer = new FileStream("sizes.xml", FileMode.Create);
                Type type = windows.GetType();
                var serializer = new DataContractSerializer(type);
                serializer.WriteObject(writer, windows);
                writer.Close();
            }
        }

        static void window_LocationChanged(object sender, EventArgs e)
        {
            Form realSender = (Form)sender;
            if (windows.ContainsKey(realSender.Name))
            {
                windows[realSender.Name][2] = realSender.Top;
                windows[realSender.Name][3] = realSender.Left;

                var writer = new FileStream("sizes.xml", FileMode.Create);
                Type type = windows.GetType();
                var serializer = new DataContractSerializer(type);
                serializer.WriteObject(writer, windows);
                writer.Close();
            }
        }

        static Dictionary<string, int[]> windows = new Dictionary<string, int[]>();
    }
}

Keine Kommentare:

Kommentar veröffentlichen