Laden...

Fenster skalieren nur für die Höhe erlauben

Erstellt von Annika234 vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.499 Views
A
Annika234 Themenstarter:in
13 Beiträge seit 2019
vor 4 Jahren
Fenster skalieren nur für die Höhe erlauben

Ich habe ein WPF-Fenster, die breite dieses Fensters soll sich an den Content anpassen und dann fest bleiben. Die Höhe soll sich beim ersten öffnen auch an den Inhalt anpassen, dann aber veränderbar sein.
Gibt es eine Möglichkeit, das zu programmieren?

Das ist der Code für mein Fenster


<Window x:Class="Inventurliste.EinkaufslisteView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:Inventurliste"
        mc:Ignorable="d"
        Title="EinkaufslisteView" SizeToContent="WidthAndHeight" ResizeMode="CanMinimize>

ich kann natürlich den ResizeMode einfach auf CanResize stellen, allerdings kann dann auch die Breite wieder verändert werden, das möchte ich nicht.

Ich kann leider keine festen Daten für die Breite verwenden, da diese je nach Einstellung zur Schriftgröße variiert.

S
248 Beiträge seit 2008
vor 4 Jahren

Hallo,

dies könnte ein Lösungsweg sein:
WPF Window - Only allow horizontal resize

Grüße

A
Annika234 Themenstarter:in
13 Beiträge seit 2019
vor 4 Jahren

Hallo Spook

Daran habe ich auch schon gedacht. Das kommt allerdings für mich nicht infrage, da die Breite nicht fix ist, sondern erst beim öffnen gesetzt werden kann. Denn je nach eingestellter Schriftgröße ist der Inhalt des Fensters unterschiedlich breit

T
461 Beiträge seit 2013
vor 4 Jahren

Wieso nicht, die 2te Antwort würde hinkommen, nur daß du halt MinWidth und MaxWidth mit der aktuellen Breite setzt und ResizeMode entsprechend änderst im Loaded.

Natürlich könnte man das auch MVVM fähig machen...aber die Grundidee sollte so funktionieren...

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

A
Annika234 Themenstarter:in
13 Beiträge seit 2019
vor 4 Jahren

Die Funktioniert leider auch nicht, da das Loaded Event wahrscheinlich leider vor SizeToContent ausgelöst wird. Dadurch passt die Fenstergröße nicht. Selbst wenn ich das SizeToContent direkt in der Methode setze funktioniert es nicht. Wahrscheinlich ist zu diesem Zeitpunkt noch nicht der ganze Content geladen.

T
461 Beiträge seit 2013
vor 4 Jahren

Also in der Doku steht es anders: https://docs.microsoft.com/de-de/dotnet/api/system.windows.frameworkelement.loaded?view=netframework-4.8

Tritt auf, wenn das Element ausgerichtet und gerendert sowie zur Interaktion vorbereitet wurde.

Könnte mich auch täuschen, da ich nie so ein Problem hatte (soweit ich mich erinnern kann 😉 )

Schlimmsten Falls gäbe es noch das SizeChanged inwieweit man dieses Event handelt sodass nur der letzte Aufruf verwendet wird danach das EVent De-Registriert wird, weiß ich jetzt nicht.

Zudem könnte man es selbst testen, mittels Breakpoints, welches Event zuletzt aufgerufen wird.

Wenn es doch das Loaded Event ist, dann dürfte das Problem woanders liegen.

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

S
248 Beiträge seit 2008
vor 4 Jahren

Hallo,

da das Loaded Event wahrscheinlich leider vor SizeToContent ausgelöst wird

Dies sollte eigentlich nicht der Fall sein.
Du könntest allerdings versuchen mit Hilfe des Dispatchers die Fixierung der Breite so zu verzögern, dass diese nach deinem Layoutprozess passiert.

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.Dispatcher.BeginInvoke(new Action(() =>
            {
                this.MinWidth = this.MaxWidth = this.ActualWidth;
            }), DispatcherPriority.Background);
        }

Dabei musst du ggf. mit dem DispatcherPriority-Wert spielen, wobei 'Loaded' dem Loaded-Event des Fensters entpricht.

PS: Die Reihenfolge der Window-Events ist:1.Initialized 1.Loaded 1.Activated

Vielleicht reicht es auch den Code im Activated-Event auszuführen.
(Activated wird allerdings jedes Mal aufgrufen, wenn das Window aktiv wird! Daher wäre es sinnvoll hier das Event wieder zu deregistrieren.)

Grüße

C
132 Beiträge seit 2008
vor 4 Jahren

Wieso so kompliziert?

Dem Window SizeToContent=WidthAndHeight mitgeben und dann im Loaded Event zunächst die MinWidth, MaxWidth und MinHeight auf die aktuellen Werte setzen sowie zum Abschluss den SizeToContent wieder auf Manual.

Es muss ja nur erstmal die Anpassung an den Content erfolgen um die Werte zu setzen.

U
69 Beiträge seit 2019
vor 4 Jahren

Im Kommentar zur zweiten StackOverflow-Antwort steht:

Just as Tim Richards recommends, I had to move setting the MinHeight and MaxHeight properties to the ContentRendered event....

Vielleicht hilft das ja.

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
U
69 Beiträge seit 2019
vor 4 Jahren

PS: Die Reihenfolge der Window-Events ist:1.Initialized 1.Loaded 1.Activated

Laut Microsoft ist die Reihenfolge so:1.Initialized 1.Activated 1.Loaded 1.ContentRendered

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
S
248 Beiträge seit 2008
vor 4 Jahren

Hallo Urza,

dies entspricht nicht dem was ich beim Debuggen einer leeren Anwendung (.NET 4.8) erhalte. Vielleicht ist die Dokumentation hier nicht korrekt oder auf dem neusten Stand.

Grüße

16.807 Beiträge seit 2008
vor 4 Jahren

Ich bezweifle, dass die Doku an dieser Stelle falsch ist.
Ihr habt aber beide ShowActivated beachtet, das die LifeTime Events beeinflusst?

U
69 Beiträge seit 2019
vor 4 Jahren

Hi Abt,

ShowActivated sogt ja "nur" dafür, dass Activated nicht aufgerufen würde.
Daher würde ich erstmal den Ansatz mit ContentRendered verfolgen, der bleibt davon ja unberührt.
Aber da ich aktuell kein Testprojekt vor mir habe bleibt das alles nur eine Vermutung.

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
16.807 Beiträge seit 2008
vor 4 Jahren

Naja, wenn man Deinem Link folgt dann sehe zumindest ich eine grafische Darstellung, bei der ShowActivated die Reihenfolge beeinflusst - und das eure Unterschiede erklären könnte.

U
69 Beiträge seit 2019
vor 4 Jahren

Jetzt verstehe ich worauf du hinaus möchtest...
Ich habe es jetzt auch mal mit einem Testprogramm (.NET 4.6.1) getestet.
Sowohl mit ShowActivated = true als auch mit ShowActivated = false.
In beiden Szenarien verhält es sich bei mir so wie in der Doku beschrieben...

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
A
Annika234 Themenstarter:in
13 Beiträge seit 2019
vor 4 Jahren

Vielen Dank für eure Hilfe, ich habe den Aufruf jetzt in das ContentRenderd Event gemacht. Jetzt funktioniert es. Ist zwar nicht MVVM aber was solls, das ist mir jetzt erstmal egal. 😉