myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und Silverlight » Fenster skalieren nur für die Höhe erlauben
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Fenster skalieren nur für die Höhe erlauben

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Annika234 Annika234 ist weiblich
myCSharp.de-Mitglied

Dabei seit: 11.05.2019
Beiträge: 13


Annika234 ist offline

Fenster skalieren nur für die Höhe erlauben

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

XML-Code:
<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.
13.08.2019 10:48 Beiträge des Benutzers | zu Buddylist hinzufügen
Spook Spook ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.10.2008
Beiträge: 197
Entwicklungsumgebung: VS2015 Professional
Herkunft: Esslingen a.N.


Spook ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

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

Grüße
13.08.2019 12:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Annika234 Annika234 ist weiblich
myCSharp.de-Mitglied

Dabei seit: 11.05.2019
Beiträge: 13

Themenstarter Thema begonnen von Annika234

Annika234 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 13.08.2019 15:48.

13.08.2019 15:47 Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 437
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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...
13.08.2019 17:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Annika234 Annika234 ist weiblich
myCSharp.de-Mitglied

Dabei seit: 11.05.2019
Beiträge: 13

Themenstarter Thema begonnen von Annika234

Annika234 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 14.08.2019 04:40.

14.08.2019 04:38 Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 437
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 Augenzwinkern )

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.
14.08.2019 07:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Spook Spook ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.10.2008
Beiträge: 197
Entwicklungsumgebung: VS2015 Professional
Herkunft: Esslingen a.N.


Spook ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

C#-Code:
        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
14.08.2019 07:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Chronos Chronos ist männlich
myCSharp.de-Mitglied

Dabei seit: 18.03.2008
Beiträge: 128
Entwicklungsumgebung: VS 2019 CE
Herkunft: NRW


Chronos ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Chronos am 14.08.2019 08:20.

14.08.2019 08:02 Beiträge des Benutzers | zu Buddylist hinzufügen
Urza Urza ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.05.2019
Beiträge: 23
Entwicklungsumgebung: VS 2017, VS 2019, ReSharper


Urza ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
14.08.2019 09:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Urza Urza ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.05.2019
Beiträge: 23
Entwicklungsumgebung: VS 2017, VS 2019, ReSharper


Urza ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 14.08.2019 12:32.

14.08.2019 12:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Spook Spook ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.10.2008
Beiträge: 197
Entwicklungsumgebung: VS2015 Professional
Herkunft: Esslingen a.N.


Spook ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
14.08.2019 13:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.919
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich bezweifle, dass die Doku an dieser Stelle falsch ist.
Ihr habt aber beide ShowActivated beachtet, das die LifeTime Events beeinflusst?
14.08.2019 15:22 Beiträge des Benutzers | zu Buddylist hinzufügen
Urza Urza ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.05.2019
Beiträge: 23
Entwicklungsumgebung: VS 2017, VS 2019, ReSharper


Urza ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
14.08.2019 16:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.919
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
14.08.2019 17:12 Beiträge des Benutzers | zu Buddylist hinzufügen
Urza Urza ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.05.2019
Beiträge: 23
Entwicklungsumgebung: VS 2017, VS 2019, ReSharper


Urza ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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...
15.08.2019 09:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Annika234 Annika234 ist weiblich
myCSharp.de-Mitglied

Dabei seit: 11.05.2019
Beiträge: 13

Themenstarter Thema begonnen von Annika234

Annika234 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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. ;)
16.08.2019 07:05 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 22.08.2019 16:22