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.
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
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... 😄
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.
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... 😄
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
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.
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.”
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.”
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
Ich bezweifle, dass die Doku an dieser Stelle falsch ist.
Ihr habt aber beide ShowActivated
beachtet, das die LifeTime Events beeinflusst?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.”
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.”
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. 😉