Laden...

WPF Fensterposition und Größe speichern

Erstellt von Campy vor 9 Jahren Letzter Beitrag vor einem Jahr 3.137 Views
C
Campy Themenstarter:in
439 Beiträge seit 2008
vor 9 Jahren
WPF Fensterposition und Größe speichern

Hallo zusammen,

macht es Sinn (Stichwort usability) die Fensterposition und Größe der Anwendungsfenster zu speichern? Wenn ja wie löst Ihr das Problem mit wechselnden Auflösungen (Notebook mit externen Monitor etc.)?

Wo und wie speichert Ihr die Position und Größe ab?

Vielen Dank!

A programmer is just a tool, which converts coffeine into code! 🙂

74 Beiträge seit 2014
vor 9 Jahren

Hi,

da muss man nichts selber bauen, die Windows API bietet diese Funktion bereits. Folgenden Code habe ich mal (fast genauso) in einem Blog oder Artikel gefunden, weiß leider nicht mehr wo.


    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;

        public RECT(int left, int top, int right, int bottom)
        {
            Left = left;
            Top = top;
            Right = right;
            Bottom = bottom;
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int X;
        public int Y;

        public POINT(int x, int y)
        {
            X = x;
            Y = y;
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct WINDOWPLACEMENT
    {
        public int length;
        public int flags;
        public int showCmd;
        public POINT minPosition;
        public POINT maxPosition;
        public RECT normalPosition;
    }

    public static class WindowPlacement
    {
        private const int SW_SHOWNORMAL = 1;
        private const int SW_SHOWMINIMIZED = 2;

        public static void SetPlacement(IntPtr windowHandle, WINDOWPLACEMENT placement)
        {
            placement.length = Marshal.SizeOf(typeof(WINDOWPLACEMENT));
            placement.flags = 0;
            placement.showCmd = placement.showCmd == SW_SHOWMINIMIZED ? SW_SHOWNORMAL : placement.showCmd;
            NativeMethods.SetWindowPlacement(windowHandle, ref placement);
        }

        public static WINDOWPLACEMENT GetPlacement(IntPtr windowHandle)
        {
            var placement = new WINDOWPLACEMENT();
            NativeMethods.GetWindowPlacement(windowHandle, out placement);
            return placement;
        }

        private static class NativeMethods
        {
            [DllImport("user32.dll")]
            public static extern bool SetWindowPlacement(IntPtr hWnd, [In]ref WINDOWPLACEMENT lpwndpl);

            [DllImport("user32.dll")]
            public static extern bool GetWindowPlacement(IntPtr hWnd, out WINDOWPLACEMENT lpwndpl);
        }
    }

Ich habe leider noch nicht ausprobieren können wie gut das funktioniert, wenn ein Monitor nicht mehr da ist. Wenn du möchtest kannst du mich aufklären 😉

Ich würde diesen Code vielleicht als Behavior implementieren, um diese Funktion auch mit anderen Fenstern nutzen zu können.

Grüße

C
Campy Themenstarter:in
439 Beiträge seit 2008
vor einem Jahr

@TH69
Ich weiß, der Thread ist ewig alt - aber heutzutage mit Skalierung etc. scheint das nicht mehr wirklich zu funktionieren.

Im Detail geht es mir darum, die Position und die Größe in der Datenbank speichern zu können.

Gibt es dazu neue Best Practices?

Viele Grüße
Campy

A programmer is just a tool, which converts coffeine into code! 🙂

2.079 Beiträge seit 2012
vor einem Jahr

Du kannst nur Position und Maße speichern.
Was willst Du da noch machen bzw. was funktioniert nicht?

Position und Maße zu ändern, funktioniert auch heute noch, habe ich vorhin erst gemacht.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

C
Campy Themenstarter:in
439 Beiträge seit 2008
vor einem Jahr

Dann liegt das Problem woanders - ich bekomm teilweise negative Werte oder Werte mit 254 etc.
Da der Code aber schon mal funktioniert hat, bin ich von einer Änderung ausgegangen.

Vielen Dank trotzdem!

A programmer is just a tool, which converts coffeine into code! 🙂

2.079 Beiträge seit 2012
vor einem Jahr

Ich hab mir den Code nicht angeschaut (und deinen Code zeigst Du nicht), aber negative Werte können durchaus vorkommen.

Die Position X:0/Y:0 ist immer links oben vom Haupt-Monitor!
Wenn Du links daneben einen zweiten Monitor hast, dann hat der eine negative X-Position.
Und wenn darüber ein zweiter Monitor ist, dann hat der eine negative Y-Position.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

C
Campy Themenstarter:in
439 Beiträge seit 2008
vor einem Jahr

Hallo,

ich habe die Lösung nun noch gefunden. Es lag an den Telerik Controls und der Custom non-client Area von Telerik RibbonWindow.

Weitere Informationen: Link

Hatte also tatsächlich nichts mit dem Speichern und Laden der Einstellungen zu tun.

Vielen Dank!

A programmer is just a tool, which converts coffeine into code! 🙂

T
50 Beiträge seit 2010
vor einem Jahr

Wir schreiben die Daten in das lokale Profil des Benutzers, genauer gesagt in die Registry. Datenbank ist hier - denke ich - nicht notwendig, da es sich um unwichtige Informationen handeln, die der Nutzer jederzeit durch die Positionierung des Fensters wieder herstellen kann.

Interessanter ist aber, dass wir die Positionierung abhängig von der Gesamtauflösung (WorkingArea) speichern. Warum? Durch die ganze Homeoffice-Geschichte kommt es häufiger vor, dass auf den Rechner lokal oder remote zugegriffen wird und hier unterschiedliche Monitor-Konstellationen vorhanden sind.