Wenn der Benutzer die Größe des Fensters meiner Anwendung ändert, möchte ich, dass die Anwendung dieselbe Größe hat, wenn die Anwendung erneut geöffnet wird.
Zuerst habe ich mir überlegt, das SizeChanged-Ereignis zu behandeln und Höhe und Breite zu speichern, aber ich denke, es muss eine einfachere Lösung geben.
Ziemlich einfaches Problem, aber ich kann keine einfache Lösung dafür finden.
Antworten:
Speichern Sie die Werte in der Datei user.config.
Sie müssen den Wert in der Einstellungsdatei erstellen - er sollte sich im Ordner Eigenschaften befinden. Erstellen Sie fünf Werte:
Top
vom Typdouble
Left
vom Typdouble
Height
vom Typdouble
Width
vom Typdouble
Maximized
vom Typbool
- um zu halten, ob das Fenster maximiert ist oder nicht. Wenn Sie weitere Informationen speichern möchten, wird ein anderer Typ oder eine andere Struktur benötigt.Initialisieren Sie die ersten beiden auf 0 und die zweiten beiden auf die Standardgröße Ihrer Anwendung und die letzte auf false.
Erstellen Sie einen Window_OnSourceInitialized-Ereignishandler und fügen Sie Folgendes hinzu:
ANMERKUNG: Die festgelegte Fensterplatzierung muss im initialisierten Ereignis des Fensters und nicht im Konstruktor erfolgen. Wenn Sie das Fenster auf einem zweiten Monitor maximiert haben, wird es auf dem primären Monitor immer maximiert neu gestartet, und Sie können es nicht um darauf zuzugreifen.
Erstellen Sie einen Window_Closing-Ereignishandler und fügen Sie Folgendes hinzu:
Dies schlägt fehl, wenn der Benutzer den Anzeigebereich verkleinert - entweder durch Trennen eines Bildschirms oder Ändern der Bildschirmauflösung -, während die Anwendung geschlossen ist. Fügen Sie daher vor dem Anwenden der Werte eine Überprüfung hinzu, ob der gewünschte Speicherort und die gewünschte Größe noch gültig sind.
quelle
Eigentlich müssen Sie dafür kein Code-Behind verwenden (außer zum Speichern der Einstellungen). Sie können eine benutzerdefinierte Markup-Erweiterung verwenden, um die Fenstergröße und -position an folgende Einstellungen zu binden:
Den Code für diese Markup-Erweiterung finden Sie hier: http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/
quelle
{Binding Settings.Height}
usw.Während Sie "Ihre eigenen rollen" und die Einstellungen manuell irgendwo speichern können und es im Allgemeinen funktioniert, ist es sehr einfach, nicht alle Fälle richtig zu behandeln. Es ist viel besser, das Betriebssystem die Arbeit für Sie erledigen zu lassen, indem Sie GetWindowPlacement () beim Beenden und SetWindowPlacement () beim Start aufrufen . Es behandelt alle verrückten Randfälle, die auftreten können (mehrere Monitore, speichern Sie die normale Größe des Fensters, wenn es bei Maximierung geschlossen wird usw.), damit Sie dies nicht tun müssen.
Dieses MSDN-Beispiel zeigt, wie diese mit einer WPF-App verwendet werden. Das Beispiel ist nicht perfekt (das Fenster wird in der oberen linken Ecke beim ersten Durchlauf so klein wie möglich gestartet, und es gibt ein merkwürdiges Verhalten
WINDOWPLACEMENT
, wenn der Einstellungsdesigner einen Wert vom Typ speichert ), aber es sollte zumindest den Einstieg erleichtern.quelle
Die "Langform" -Bindung, die Thomas oben gepostet hat, erfordert fast keine Codierung. Stellen Sie nur sicher, dass Sie die Namespace-Bindung haben:
Dann, um den Code-Behind zu speichern:
quelle
WindowState="{Binding Source={x:Static properties:Settings.Default}, Path=WindowState, Mode=TwoWay}"
Alternativ könnte Ihnen auch der folgende Ansatz gefallen ( siehe Quelle ). Fügen Sie die WindowSettings-Klasse zu Ihrem Projekt hinzu und fügen Sie sie
WindowSettings.Save="True"
in die Kopfzeile Ihres Hauptfensters ein:Wobei WindowSettings wie folgt definiert ist:
quelle
Die Standardlösung besteht darin, Einstellungsdateien zu verwenden. Das Problem mit Einstellungsdateien besteht darin, dass Sie alle Einstellungen definieren und den Code schreiben müssen, der die Daten selbst hin und her kopiert. Ziemlich langweilig, wenn Sie viele Eigenschaften im Auge behalten müssen.
Ich habe dafür eine ziemlich flexible und sehr einfach zu verwendende Bibliothek erstellt. Sie sagen ihr einfach, welche Eigenschaften von welchem Objekt verfolgt werden sollen, und sie erledigt den Rest. Sie können den Mist auch daraus konfigurieren, wenn Sie möchten.
Die Bibliothek heißt Jot (Github) , hier ist ein alter CodeProject-Artikel, den ich darüber geschrieben habe.
So würden Sie es verwenden, um die Größe und Position eines Fensters zu verfolgen:
Jot vs. Einstellungsdateien: Mit Jot gibt es erheblich weniger Code und es ist viel weniger fehleranfällig, da Sie jede Eigenschaft nur einmal erwähnen müssen . Bei Einstellungsdateien müssen Sie jede Eigenschaft fünfmal erwähnen : einmal, wenn Sie die Eigenschaft explizit erstellen, und weitere viermal im Code, der die Werte hin und her kopiert.
Speicher, Serialisierung usw. sind vollständig konfigurierbar. Wenn Sie IOC verwenden, können Sie es sogar so anschließen, dass die Nachverfolgung automatisch auf alle aufgelösten Objekte angewendet wird. Alles, was Sie tun müssen, um eine Eigenschaft dauerhaft zu machen, ist, ein Attribut [Nachverfolgbar] darauf zu setzen.
Ich schreibe das alles, weil ich denke, dass die Bibliothek erstklassig ist und ich darüber reden möchte.
quelle
Ich habe eine kurze Klasse geschrieben, die dies tut. So heißt es:
Und hier ist der Code:
quelle
Es gibt ein NuGet-Projekt RestoreWindowPlace auf github , das all dies für Sie erledigt und die Informationen in einer XML-Datei speichert.
Damit es in einem Fenster funktioniert, müssen Sie lediglich Folgendes aufrufen:
((App)Application.Current).WindowPlace.Register(this);
In der App erstellen Sie die Klasse, die Ihre Fenster verwaltet. Weitere Informationen finden Sie oben unter dem Github-Link.
quelle
Das könnte dir gefallen:
Wenn die App geschlossen wird:
Wenn die App startet:
quelle
Erstellen Sie in Ihren Standardeinstellungen eine Zeichenfolge mit dem Namen WindowXml.
Verwenden Sie diese Erweiterungsmethode für Ihre Ereignisse zum Laden und Schließen von Fenstern, um die Größe und den Speicherort des Fensters wiederherzustellen und zu speichern.
quelle
Ich verwende die Antwort von Lance Cleveland und binde die Einstellung. Aber ich verwende etwas mehr Code, um zu vermeiden, dass mein Fenster nicht auf dem Bildschirm angezeigt wird.
quelle
Ich habe eine allgemeinere Lösung basierend auf RandomEngys brillanter Antwort gemacht. Es speichert die Position in der Datei im laufenden Ordner und Sie müssen nicht für jedes neue Fenster, das Sie erstellen, neue Eigenschaften erstellen. Diese Lösung funktioniert hervorragend für mich mit minimalem Code im Code dahinter.
Fügen Sie in Ihrem Code dahinter diese beiden Methoden hinzu
Im XAML-Fenster fügen Sie dies hinzu
quelle