Fondamentalement, lorsque l'utilisateur redimensionne la fenêtre de mon application, je veux que l'application soit de la même taille lorsque l'application est à nouveau ouverte.
Au début, j'ai pensé à gérer l'événement SizeChanged et à enregistrer la hauteur et la largeur, mais je pense qu'il doit y avoir une solution plus simple.
Problème assez simple, mais je ne peux pas y trouver de solution facile.
Réponses:
Enregistrez les valeurs dans le fichier user.config.
Vous devrez créer la valeur dans le fichier de paramètres - elle doit se trouver dans le dossier Propriétés. Créez cinq valeurs:
Top
de typedouble
Left
de typedouble
Height
de typedouble
Width
de typedouble
Maximized
de typebool
- pour conserver si la fenêtre est agrandie ou non. Si vous souhaitez stocker plus d'informations, un type ou une structure différent sera nécessaire.Initialisez les deux premiers à 0 et les deux seconds à la taille par défaut de votre application et le dernier à false.
Créez un gestionnaire d'événements Window_OnSourceInitialized et ajoutez ce qui suit:
REMARQUE: le placement de la fenêtre défini doit aller dans l'événement initialisé sur la source de la fenêtre et non du constructeur, sinon si vous avez la fenêtre agrandie sur un deuxième moniteur, elle redémarrera toujours maximisée sur le moniteur principal et vous ne pourrez pas pour y accéder.
Créez un gestionnaire d'événements Window_Closing et ajoutez ce qui suit:
Cela échouera si l'utilisateur réduit la zone d'affichage - soit en déconnectant un écran ou en modifiant la résolution de l'écran - pendant que l'application est fermée, vous devez donc ajouter une vérification que l'emplacement et la taille souhaités sont toujours valides avant d'appliquer les valeurs.
la source
En fait, vous n'avez pas besoin d'utiliser le code-behind pour le faire (sauf pour enregistrer les paramètres). Vous pouvez utiliser une extension de balisage personnalisée pour lier la taille et la position de la fenêtre aux paramètres comme ceci:
Vous pouvez trouver le code de cette extension de balisage ici: http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/
la source
{Binding Settings.Height}
, etc.Bien que vous puissiez "rouler vous-même" et enregistrer manuellement les paramètres quelque part, et en général cela fonctionnera, il est très facile de ne pas gérer correctement tous les cas. Il est préférable de laisser le système d'exploitation faire le travail pour vous, en appelant GetWindowPlacement () à la sortie et SetWindowPlacement () au démarrage. Il gère tous les cas de bord fous qui peuvent survenir (plusieurs moniteurs, enregistrez la taille normale de la fenêtre si elle est fermée tout en maximisant, etc.) afin que vous n'ayez pas à le faire.
Cet exemple MSDN montre comment les utiliser avec une application WPF. L'exemple n'est pas parfait (la fenêtre commencera dans le coin supérieur gauche aussi petit que possible lors de la première exécution, et il y a un comportement étrange avec le concepteur de paramètres enregistrant une valeur de type
WINDOWPLACEMENT
), mais cela devrait au moins vous aider à démarrer.la source
La liaison "longue forme" que Thomas a postée ci-dessus ne nécessite presque aucun codage, assurez-vous simplement que vous avez la liaison d'espace de noms:
Ensuite, pour enregistrer sur le code-behind:
la source
WindowState="{Binding Source={x:Static properties:Settings.Default}, Path=WindowState, Mode=TwoWay}"
Vous pourriez également aimer l'approche suivante ( voir source ). Ajoutez la classe WindowSettings à votre projet et insérez-la
WindowSettings.Save="True"
dans l'en-tête de votre fenêtre principale:Où WindowSettings est défini comme suit:
la source
Le moyen par défaut de le résoudre consiste à utiliser des fichiers de paramètres. Le problème avec les fichiers de paramètres est que vous devez définir tous les paramètres et écrire vous-même le code qui copie les données d'avant en arrière. Assez fastidieux si vous avez beaucoup de propriétés à suivre.
J'ai créé une bibliothèque assez flexible et très facile à utiliser pour cela, il vous suffit de lui dire quelles propriétés de quel objet suivre et il s'occupe du reste. Vous pouvez également en configurer la merde si vous le souhaitez.
La bibliothèque s'appelle Jot (github) , voici un ancien article de CodeProject j'ai écrit à ce sujet.
Voici comment vous l'utiliseriez pour suivre la taille et l'emplacement d'une fenêtre:
Jot vs fichiers de paramètres: avec Jot, il y a beaucoup moins de code, et c'est beaucoup moins sujet aux erreurs puisque vous n'avez besoin de mentionner chaque propriété qu'une seule fois . Avec les fichiers de paramètres, vous devez mentionner chaque propriété 5 fois : une fois lorsque vous créez explicitement la propriété et quatre fois supplémentaires dans le code qui copie les valeurs dans les deux sens.
Le stockage, la sérialisation, etc. sont entièrement configurables. De plus, lorsque vous utilisez IOC, vous pouvez même le connecter pour qu'il applique automatiquement le suivi à tous les objets qu'il résout. Tout ce que vous avez à faire pour rendre une propriété persistante est de lui appliquer un attribut [Trackable].
J'écris tout cela parce que je pense que la bibliothèque est de premier ordre et je veux en parler.
la source
J'ai écrit un cours rapide qui fait cela. Voici comment ça s'appelle:
Et voici le code:
la source
Il existe un projet NuGet RestoreWindowPlace voir sur github qui fait tout cela pour vous, en enregistrant les informations dans un fichier XML.
Pour le faire fonctionner sur une fenêtre, c'est aussi simple que d'appeler:
((App)Application.Current).WindowPlace.Register(this);
Dans App, vous créez la classe qui gère vos fenêtres. Voir le lien github ci-dessus pour plus d'informations.
la source
Vous pourriez aimer ceci:
Lorsque l'application se ferme:
Lorsque l'application démarre:
la source
Créez une chaîne nommée WindowXml dans vos paramètres par défaut.
Utilisez cette méthode d'extension sur vos événements Window Loaded et Closing pour restaurer et enregistrer la taille et l'emplacement de la fenêtre.
la source
J'utilise la réponse de Lance Cleveland et lie le cadre. Mais j'utilise un peu plus de code pour éviter que ma fenêtre ne soit hors de l'écran.
la source
J'ai créé une solution plus générique basée sur la réponse brillante de RandomEngys. Il enregistre la position dans le fichier dans le dossier en cours et vous n'avez pas besoin de créer de nouvelles propriétés pour chaque nouvelle fenêtre que vous créez. Cette solution fonctionne très bien pour moi avec un code minimal dans le code derrière.
Dans votre code derrière vous ajoutez ces deux méthodes
dans la fenêtre xaml, vous ajoutez ceci
la source