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
Fenster skalieren nur für die Höhe erlauben
Annika234
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

Fenster skalieren nur für die Höhe erlauben

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 247
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

Hallo,

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

Grüße
private Nachricht | Beiträge des Benutzers
Annika234
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 456

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 456

beantworten | zitieren | melden

Also in der Doku steht es anders: https://docs.microsoft.com/de-de/dotnet/api/system.windows.frameworkelement.loaded?view=netframework-4.8
Zitat
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...
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 247
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

Hallo,
Zitat
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
  2. Loaded
  3. 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
private Nachricht | Beiträge des Benutzers
Chronos
myCSharp.de - Member



Dabei seit:
Beiträge: 132
Herkunft: NRW

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 69

beantworten | zitieren | melden

Im Kommentar zur zweiten StackOverflow-Antwort steht:
Zitat
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
private Nachricht | Beiträge des Benutzers
Urza
myCSharp.de - Member



Dabei seit:
Beiträge: 69

beantworten | zitieren | melden

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

Laut Microsoft ist die Reihenfolge so:
  1. Initialized
  2. Activated
  3. Loaded
  4. ContentRendered
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Urza am .
“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

- Patrick to Spongebob
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 247
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

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

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.310

beantworten | zitieren | melden

Ich bezweifle, dass die Doku an dieser Stelle falsch ist.
Ihr habt aber beide ShowActivated beachtet, das die LifeTime Events beeinflusst?
private Nachricht | Beiträge des Benutzers
Urza
myCSharp.de - Member



Dabei seit:
Beiträge: 69

beantworten | zitieren | melden

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

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.310

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 69

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

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