2008-10-29 9 views
11

Nous planifions actuellement une application WPF LoB plus grande et je me demande ce que les autres pensent être la meilleure pratique pour stocker de nombreux paramètres d'interface utilisateur, par exemple.Meilleures pratiques pour stocker les paramètres de l'interface utilisateur

  • Etats Expander
  • commandes de menu
  • Propriétés Dimensionnement
  • etc ...

Je n'aime pas l'idée d'avoir des dizaines de valeurs stockées à l'aide de la SettingsProvider délivrée (c.-à- Fichier App.config), bien qu'il puisse être utilisé pour le stocker dans une base de données intégrée à l'aide d'un SettingsProvider personnalisé. être capable d'utiliser une sorte de liaison de données est également une préoccupation. Est-ce que quelqu'un a eu les mêmes problèmes?

Qu'avez-vous fait pour stocker beaucoup de paramètres utilisateur de l'interface utilisateur?

Répondre

1

Semble perdre de la popularité pour une raison quelconque; mais le registre a toujours été un endroit approprié pour ce genre de configuration.

+1

Le registre est absolument pas le bon endroit plus. Les registres sont corrompus, une utilisation inappropriée peut entraîner des problèmes de sécurité et enfreindre les principes LUA/UAC. http://secureapps.blogspot.com/2006/10/windows-registry-application-security.html –

+0

Eh bien, les paramètres de l'interface utilisateur ne sont pas très importants pour la sécurité, n'est-ce pas? – Treb

+0

Ils sont facilement corruptibles et sujets aux erreurs. Je préférerais les avoir facilement accessibles par les utilisateurs communs. – thismat

13

Nous stockons le fichier de préférences ici:

Environment.SpecialFolder.ApplicationData 

magasin comme fichier xml « Préférences » il est donc pas si difficile à trouver et changer si jamais il est corrompu. Jusqu'à présent, cela a fonctionné beaucoup mieux que le registre pour nous, il est plus propre et plus facile à souffler si quelque chose est corrompu ou doit être réinitialisé.

2

Nous stockons tous dans le Isolation Storage (nous sommes en cours d'exécution avec ClickOnce). Nous avons un objet que nous sérialisons (XmlSerializer).

1

Nous utilisons un SettingsProvider personnalisé pour stocker les informations de configuration dans une table de la base de données de l'application. C'est une bonne solution si vous utilisez déjà une base de données.

1

Dans la programmation WPF par Chris Sells & Ian Griffiths, il dit

Le mécanisme de réglage préféré pour une application WPF est celui fourni par .NET et VS: la classe ApplicationSettingBase de l'espace de noms System.Configuration avec le haut -in concepteur.

+0

Malheureusement, le concepteur de paramètres (dans vs2008) matérialise tous les paramètres définis dans le concepteur en tant qu'entrées DefaultSettingValueAttribute dans le fichier settings.Designer.vb. Il semble qu'il n'y ait aucun moyen de l'éteindre. Si vous éditez le fichier de configuration à la main, la prochaine fois que vous le modifiez dans le concepteur de paramètres, il se synchronisera de nouveau. C'est tellement mauvais. Cela peut entraîner le déploiement d'une application avec des valeurs par défaut codées en dur (qui sont quelque peu cachées), qui prendront des mesures si les paramètres app.config sont manquants. http://tinyurl.com/3xyzz66 – Topdown

10

La méthode la plus rapide pour stocker les paramètres de l'interface utilisateur consiste à utiliser le système Properties.Settings.Default. Ce qui peut être sympa avec cela est d'utiliser la liaison WPF à la valeur. Example here. Les paramètres sont automatiquement mis à jour et chargés.

<Window ... 
    xmlns:p="clr-namespace:UserSettings.Properties" 
    Height="{Binding Source={x:Static p:Settings.Default}, Path=Height, Mode=TwoWay}" 
    Width="{Binding Source={x:Static p:Settings.Default}, Path=Width, Mode=TwoWay}" 
    Left="{Binding Source={x:Static p:Settings.Default}, Path=Left, Mode=TwoWay}" 
    Top="{Binding Source={x:Static p:Settings.Default}, Path=Top, Mode=TwoWay}"> 

... 
protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    Settings.Default.Save(); 
    base.OnClosing(e); 
} 

Le problème avec cela est qu'il devient vite un gâchis si votre application est grande.

Une autre solution (proposée par quelqu'un ici) consiste à utiliser le chemin ApplicationData pour stocker vos propres préférences dans XML. Là, vous pouvez créer votre propre classe de paramètres et utiliser le sérialiseur XML pour le conserver. Cette approche vous permet de faire la migration des versions vers les versions. Tout en étant plus puissant, cette méthode nécessite un peu plus de code.

4

Creuser dans la réponse d'Aogan et la combiner avec la réponse de Decasteljau et le blog qu'il a référencé, voici un exemple qui comble certaines lacunes qui n'étaient pas claires pour moi.

Le fichier XAML:

<Window ... 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:p="clr-namespace:MyApp" 
    Height="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndHeight, Mode=TwoWay}" 
    Width="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndWidth, Mode=TwoWay}" 
    Left="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndLeft, Mode=TwoWay}" 
    Top="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndTop, Mode=TwoWay}" 
    ... 

Et le fichier source:

namespace MyApp 
{ 
    class MainWindow .... 
    { 
     ... 

     protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
     { 
      MyAppSettings.Default.Save(); 
      base.OnClosing(e); 
     } 
    } 

    public sealed class MyAppSettings : System.Configuration.ApplicationSettingsBase 
    { 
     private static MyAppSettings defaultInstance = ((MyAppSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new MyAppSettings()))); 
     public static MyAppSettings Default 
     { 
      get { return defaultInstance; } 
     } 

     [System.Configuration.UserScopedSettingAttribute()] 
     [System.Configuration.DefaultSettingValueAttribute("540")] 
     public int MainWndHeight 
     { 
      get { return (int)this["MainWndHeight"]; } 
      set { this["MainWndHeight"] = value; } 
     } 

     [System.Configuration.UserScopedSettingAttribute()] 
     [System.Configuration.DefaultSettingValueAttribute("790")] 
     public int MainWndWidth 
     { 
      get { return (int)this["MainWndWidth"]; } 
      set { this["MainWndWidth"] = value; } 
     } 

     [System.Configuration.UserScopedSettingAttribute()] 
     [System.Configuration.DefaultSettingValueAttribute("300")] 
     public int MainWndTop 
     { 
      get { return (int)this["MainWndTop"]; } 
      set { this["MainWndTop"] = value; } 
     } 

     [System.Configuration.UserScopedSettingAttribute()] 
     [System.Configuration.DefaultSettingValueAttribute("300")] 
     public int MainWndLeft 
     { 
      get { return (int)this["MainWndLeft"]; } 
      set { this["MainWndLeft"] = value; } 
     } 
    } 
} 
Questions connexes