modificar archivo app c# wpf settings appsettings

c# - archivo - ¿Mejores prácticas para almacenar configuraciones de UI?



setting file c# (7)

Almacenamos el archivo de preferencias aquí:

Environment.SpecialFolder.ApplicationData

Guárdelo como archivo de "preferencias" xml para que no sea tan difícil acceder y cambiar si alguna vez se corrompe.

Hasta ahora, esto ha funcionado mucho mejor que el registro para nosotros, es más limpio y más fácil de explotar si algo se corrompe o necesita restablecerse.

actualmente estamos planificando una aplicación WPF LoB más grande y me pregunto qué piensan los demás que es la mejor práctica para almacenar muchas configuraciones de UI, por ejemplo

  • Estados expansores
  • Pedidos de menú
  • Propiedades de dimensionamiento
  • etc ...

No me gusta la idea de tener docenas de valores almacenados utilizando SettingsProvider entregado (es decir, el archivo App.config) aunque puede usarse para almacenarlo en una base de datos incrustada usando un SettingsProvider personalizado. ser capaz de utilizar algún tipo de enlace de datos también es una preocupación. ¿Alguien ha tenido los mismos problemas?

¿Qué hiciste para almacenar muchas configuraciones de usuarios de la interfaz de usuario?


Almacenamos todo en el Isolation Storage (corremos con ClickOnce). Tenemos algún objeto que serializamos (XmlSerializer).


Buscando en la respuesta de aogan y combinándola con la respuesta de decasteljau y la publicación del blog a la que hizo referencia, aquí hay un ejemplo que llena algunos vacíos que no estaban claros para mí.

El archivo 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}" ...

Y el archivo fuente:

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; } } } }


En la programación de WPF por Chris Sells e Ian Griffiths, dice

El mecanismo de configuración preferido para la aplicación WPF es el proporcionado por .NET y VS: la clase ApplicationSettingBase del espacio de nombres System.Configuration con el diseñador incorporado.


La forma más rápida de almacenar la configuración de UI es usar el sistema Properties.Settings.Default. Lo que puede ser bueno con esto es usar el enlace WPF al valor. Ejemplo aquí . Settins se actualizan y cargan automáticamente.

<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); }

El problema con eso es que rápidamente se convierte en un desastre si su aplicación es grande.

Otra solución (propuesta por alguien aquí) es usar la ruta ApplicationData para almacenar sus propias preferencias en XML. Allí puede construir su propia clase de configuración y usar el serializador XML para conservarla. Este enfoque le permite migrar de versiones a versiones. Aunque es más poderoso, este método requiere un poco más de código.


Parece estar perdiendo popularidad por alguna razón; pero el registro siempre ha sido un lugar apropiado para este tipo de configuraciones.


Utilizamos un SettingsProvider personalizado para almacenar la información de configuración en una tabla en la base de datos de la aplicación. Esta es una buena solución si ya está usando una base de datos.