C # - подход для сохранения пользовательских настроек в приложении WPF?

Вот как я это делаю в скрипте bash:

if ps ax | grep [110] | grep -v $ | grep bash | grep -v grep
then
    echo "The script is already running."
    exit 1
fi

Это позволяет мне использовать этот фрагмент для любого скрипта bash. Мне нужно было grep bash, потому что при использовании cron он создает другой процесс, который выполняет его, используя /bin/sh.

69
задан akjoshi 16 January 2018 в 17:09
поделиться

4 ответа

Вы можете сохранить информацию о своих настройках как Strings XML в Settings.Default. Создайте несколько классов для хранения ваших данных конфигурации и убедитесь, что они [Serializable]. Затем с помощью следующих помощников вы можете сериализовать экземпляры этих объектов - или List<T> (или массивы T[] и т. Д.) Из них - в String. Храните каждую из этих различных строк в своем соответствующем слоте Settings.Default в Settings.

вашего приложения WPF.

Чтобы восстановить объекты при следующем запуске приложения, прочитайте интересующую строку Settings и Deserialize ожидаемый тип T (который на этот раз должен быть явно указан в качестве аргумента типа для Deserialize<T>) .

public static String Serialize<T>(T t)
{
    using (StringWriter sw = new StringWriter())
    using (XmlWriter xw = XmlWriter.Create(sw))
    {
        new XmlSerializer(typeof(T)).Serialize(xw, t);
        return sw.GetStringBuilder().ToString();
    }
}

public static T Deserialize<T>(String s_xml)
{
    using (XmlReader xw = XmlReader.Create(new StringReader(s_xml)))
        return (T)new XmlSerializer(typeof(T)).Deserialize(xw);
}
12
ответ дан 24 November 2019 в 13:53
поделиться

Наиболее распространенный подход к этому вопросу - «Изолированное хранилище».

Сериализуйте свое состояние управления в XML или другой формат (особенно легко, если вы сохраняете свойства зависимостей в WPF), затем сохраните файл в изолированном хранилище пользователя.

Если вы хотите пойти по пути настройки приложения, я сам попробовал что-то похожее ... хотя следующий подход можно легко адаптировать для использования изолированного хранилища:

class SettingsManager
{
    public static void LoadSettings(FrameworkElement sender, Dictionary<FrameworkElement, DependencyProperty> savedElements)
    {
        EnsureProperties(sender, savedElements);
        foreach (FrameworkElement element in savedElements.Keys)
        {
            try
            {
                element.SetValue(savedElements[element], Properties.Settings.Default[sender.Name + "." + element.Name]);
            }
            catch (Exception ex) { }
        }
    }

    public static void SaveSettings(FrameworkElement sender, Dictionary<FrameworkElement, DependencyProperty> savedElements)
    {
        EnsureProperties(sender, savedElements);
        foreach (FrameworkElement element in savedElements.Keys)
        {
            Properties.Settings.Default[sender.Name + "." + element.Name] = element.GetValue(savedElements[element]);
        }
        Properties.Settings.Default.Save();
    }

    public static void EnsureProperties(FrameworkElement sender, Dictionary<FrameworkElement, DependencyProperty> savedElements)
    {
        foreach (FrameworkElement element in savedElements.Keys)
        {
            bool hasProperty =
                Properties.Settings.Default.Properties[sender.Name + "." + element.Name] != null;

            if (!hasProperty)
            {
                SettingsAttributeDictionary attributes = new SettingsAttributeDictionary();
                UserScopedSettingAttribute attribute = new UserScopedSettingAttribute();
                attributes.Add(attribute.GetType(), attribute);

                SettingsProperty property = new SettingsProperty(sender.Name + "." + element.Name,
                    savedElements[element].DefaultMetadata.DefaultValue.GetType(), Properties.Settings.Default.Providers["LocalFileSettingsProvider"], false, null, SettingsSerializeAs.String, attributes, true, true);
                Properties.Settings.Default.Properties.Add(property);
            }
        }
        Properties.Settings.Default.Reload();
    }
}

... ..и ....

  Dictionary<FrameworkElement, DependencyProperty> savedElements = new Dictionary<FrameworkElement, DependencyProperty>();

public Window_Load(object sender, EventArgs e) {
           savedElements.Add(firstNameText, TextBox.TextProperty);
                savedElements.Add(lastNameText, TextBox.TextProperty);

            SettingsManager.LoadSettings(this, savedElements);
}

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            SettingsManager.SaveSettings(this, savedElements);
        }
6
ответ дан 24 November 2019 в 13:53
поделиться

По моему опыту, сохранение всех настроек в таблице базы данных - лучшее решение. Даже не беспокойтесь о производительности. Современные базы данных быстры и могут легко хранить тысячи столбцов в таблице. Я усвоил этот трудный путь - до того, как начал сериализовать / десериализовать - кошмар. Хранение его в локальном файле или реестре имеет одну большую проблему - если вам нужно поддерживать ваше приложение и компьютер выключен - пользователь не перед ним - вы ничего не можете сделать .... если настройки находятся в БД - вы можете поменял их и альт не говоря уже о том, что можно сравнивать настройки ....

3
ответ дан 24 November 2019 в 13:53
поделиться
  1. Во всех местах, где я работал, база данных была обязательной из-за поддержки приложений. Как сказал Адам, пользователь может не находиться за своим рабочим столом, или машина может быть выключена, или вы можете быстро изменить чью-либо конфигурацию или назначить новичку конфигурацию по умолчанию (или члена команды).

  2. Если настройки могут увеличиваться по мере выпуска новых версий приложения, вы можете сохранить данные в виде больших двоичных объектов, которые затем могут быть десериализованы приложением. Это особенно полезно, если вы используете что-то вроде Prism, которое обнаруживает модули, так как вы не можете знать, какие настройки вернет модуль. Блобы могут быть введены с помощью комбинированного ключа «имя пользователя / машина». Таким образом, вы можете иметь разные настройки для каждой машины.

  3. Я не использовал встроенный класс «Настройки», поэтому воздержусь от комментариев. :)

0
ответ дан 24 November 2019 в 13:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: