Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WPF Fensterposition und Größe speichern
Campy
myCSharp.de - Member



Dabei seit:
Beiträge: 433

Themenstarter:

WPF Fensterposition und Größe speichern

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.593

beantworten | zitieren | melden

Hallo,

schau dir mal den Artikel Save and Restore WPF Window Size, Position, and/or State an - da hat sich jemand ähnliche Gedanken gemacht ;-)
private Nachricht | Beiträge des Benutzers
Lando
myCSharp.de - Member

Avatar #avatar-3452.jpg


Dabei seit:
Beiträge: 74

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Lando am .
private Nachricht | Beiträge des Benutzers
Campy
myCSharp.de - Member



Dabei seit:
Beiträge: 433

Themenstarter:

beantworten | zitieren | melden

@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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Campy am .
A programmer is just a tool, which converts coffeine into code!
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Experte

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.878
Herkunft: Düsseldorf

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Campy
myCSharp.de - Member



Dabei seit:
Beiträge: 433

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Experte

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.878
Herkunft: Düsseldorf

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Campy
myCSharp.de - Member



Dabei seit:
Beiträge: 433

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
teebeast
myCSharp.de - Member



Dabei seit:
Beiträge: 46
Herkunft: Bayern

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers