Лучшие практики для хранения настроек пользовательского интерфейса? - PullRequest
11 голосов
/ 29 октября 2008

В настоящее время мы планируем большее приложение WPF LoB, и мне интересно, что другие считают лучшим способом хранения множества настроек пользовательского интерфейса, например,

  • Expander States
  • Меню заказов
  • Размеры
  • и т.д ...

Мне не нравится идея иметь десятки сохраненных значений с использованием поставляемого SettingsProvider (то есть файла App.config), хотя его можно использовать для хранения его во встроенной базе данных с помощью пользовательского SettingsProvider. возможность использовать какую-то привязку данных также вызывает беспокойство. У кого-нибудь были такие же проблемы?

Что вы делали, чтобы хранить множество пользовательских настроек пользовательского интерфейса?

Ответы [ 7 ]

13 голосов
/ 29 октября 2008

Мы храним файл настроек здесь:

Environment.SpecialFolder.ApplicationData

Сохраните его как XML-файл "предпочтений", чтобы его было не так сложно найти и изменить, если он когда-либо будет поврежден.

До сих пор это работало намного лучше, чем реестр для нас, он чище и легче выдувается, если что-то повреждено или нуждается в сбросе.

10 голосов
/ 29 октября 2008

Более быстрый способ сохранить настройки пользовательского интерфейса - использовать систему Properties.Settings.Default. Что может быть хорошо с этим, это использовать привязку WPF к значению. Пример здесь . Настройки автоматически обновляются и загружаются.

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

Проблема в том, что если приложение большого размера, оно быстро становится беспорядком.

Другое решение (предложенное кем-то здесь) заключается в использовании пути ApplicationData для сохранения ваших собственных предпочтений в XML. Там вы можете создать свой собственный класс настроек и использовать XML-сериализатор для его сохранения. Такой подход позволяет выполнять миграцию с версий на версии. Будучи более мощным, этот метод требует немного больше кода.

4 голосов
/ 09 февраля 2010

Копаясь в ответе aogan и комбинируя его с ответом decasteljau и сообщением в блоге, на которое он ссылался, вот пример, который заполняет некоторые пробелы, которые мне не были понятны.

Файл 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}"
    ...

И исходный файл:

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; }
        }
    }
}
2 голосов
/ 29 октября 2008

Мы храним все в Isolation Storage (мы работаем с ClickOnce). У нас есть некоторый объект, который мы сериализуем (XmlSerializer).

1 голос
/ 29 октября 2008

В программировании WPF Криса Селлса и Яна Гриффитса написано

Предпочтительный механизм настройки для приложения WPF - это механизм, предоставляемый .NET и VS: класс ApplicationSettingBase из пространства имен System.Configuration со встроенным конструктором.

1 голос
/ 29 октября 2008

Мы используем пользовательский SettingsProvider для хранения информации о конфигурации в таблице в базе данных приложения. Это хорошее решение, если вы уже используете базу данных.

1 голос
/ 29 октября 2008

Кажется, почему-то теряет популярность; но реестр всегда был подходящим местом для подобных настроек.

...