Vous devez être membre et vous identifier pour publier un article.
Les visiteurs peuvent toutefois commenter chaque article par une réponse.
Sauver l'état d'une fenêtre en C# (paramètres utilisateur
Article publié le 12/03/2007 13:21:32Quand un utilisateur ferme une application, il désire souvent retrouver son application dans l’état dans lequel elle se trouvait au moment de sa fermeture.
J’ai donc appliqué ce principe à l’application Bibliobrol, et je désirais sauver les paramètres de la fenêtre principale au moment de sa fermeture.
En C#, il est très facile de lier les propriétés des composants graphiques à un fichier de configuration pour l’utilisateur. Il suffit de procéder de la manière suivante :
- Dans le panneau Explorateur de solution, ouvrir par un double clic le fichier .settings (par défaut Settings.settings, qui se trouve dans le nœud propriétés)
- Introduire un nom pour la propriété, son type, son étendue (scope), et sa valeur par défaut.
- Comme ce paramètre sera spécifique à l’utilisateur et non à l’application (il sera sauvé dans les local settings de l’utilisateur), nous choisissons l’étendue utilisateur.
- Sélectionner un composant en mode design, et ouvrir l’onglet Propriétés, Data, ApplicationSettings, PropertyBinding
- Cliquer dans la zone valeur (un bouton avec trois petits points apparaît) pour ouvrir la fenêtre de liaisons de propriétés.
Dans la fenêtre de liaisons de propriétés, sélectionner la propriété à lier, puis sélectionner le nom que nous avions donné à cette propriété dans le fichier de configuration.
Il ne nous reste plus qu’à spécifier à l’application qu’au moment de la fermeture il ne faut pas oublier de sauver les paramètres.
Code c# (4 lignes)
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { Properties.Settings.Default.Save(); }
Et voilà, rien de bien compliqué.
Le seul hic, c’est que si cette manipulation fonctionne à merveille pour les composants, cela ne semble pas fonctionner pour l’état de la fenêtre.
Nous pouvons utiliser différentes méthodes
Gérard Leblanc nous propose d’utiliser la base de registre pour sauver ces valeurs.
Code c# (31 lignes)
private void Form1_Load(object sender, EventArgs e) { RegistryKey rkcu = Registry.CurrentUser; RegistryKey rk = rkcu.OpenSubKey(@"Software\Eyrolles\Leblanc\Config\Registry", true); if (rk != null) { int W, H, X, Y; try { X = Convert.ToInt32(rk.GetValue("X")); Y = Convert.ToInt32(rk.GetValue("Y")); W = Convert.ToInt32(rk.GetValue("W")); H = Convert.ToInt32(rk.GetValue("H")); this.StartPosition = FormStartPosition.Manual; } catch (Exception) { } } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { RegistryKey rkcu = Registry.CurrentUser; RegistryKey rk = rkcu.CreateSubKey(@"Software\Eyrolles\Leblanc\Config\Registry"); rk.SetValue("X", this.Location.X); rk.SetValue("Y", this.Location.Y); rk.SetValue("W", this.Width); rk.SetValue("H", this.Height); rk.Flush(); rk.Close(); }
Pour ma part, j’ai préféré utiliser le fichier de configuration
Code c# (16 lignes)
private void MainForm_Load(object sender, EventArgs e) { try { WindowState = (FormWindowState)Enum.Parse( ConfigurationManager.AppSettings["mainFormState"] ); } catch (Exception) { WindowState = FormWindowState.Normal; } } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { }
Et voici la méthode statique que j'utilise dans la classe Config :
Code c# (29 lignes)
public static bool saveAppSetting(String key, String value) { String exePath = System.IO.Path.Combine(Environment.CurrentDirectory, "BiblioBrol.exe"); Configuration config = ConfigurationManager.OpenExeConfiguration(exePath); try { config.AppSettings.Settings[key].Value = value; ConfigurationManager.AppSettings[key] = value; } catch (NullReferenceException nre) { Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.criticalError, "Sauvegarde d'une valeur de configuration", "Soit le fichier de configuration n'est pas présent (il doit se trouver dans le même répertoire que l'application), soit il est incomplet ou endommagé.", nre, Config.instance)); } catch (Exception e) { Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.error, "Sauvegarde d'une valeur de configuration", e, Config.instance)); } try { config.Save(ConfigurationSaveMode.Modified); Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.advancedOperation, "Configuration " + key + " sauvée avec la valeur " + value, Config.instance)); } catch (ConfigurationException cEEx) { Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.error, "Sauvegarde d'une valeur de configuration", cEEx, Config.instance)); return false; } return true; }
Que ce soit dans la base de registre ou manuellement dans le fichier de configuration, il nous incombe de transformer les valeurs en chaînes de caractères ou d’effectuer l’opération inverse, alors que dans le cas des liaisons cette tâche nous est épargnée.
Un article de Steph
Source : www.microsoft.com
Version en cache
21/11/2024 09:48:59 Cette version de la page est en cache (à la date du 21/11/2024 09:48:59) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 13/09/2004, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/ast-rf-394.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.