Чтение настроек приложения по умолчанию на C#
-
09-06-2019 - |
Вопрос
У меня есть несколько настроек приложения (в области пользователя) для моего пользовательского элемента управления grid.Большинство из них - это настройки цвета.У меня есть форма, в которой пользователь может настроить эти цвета, и я хочу добавить кнопку для возврата к настройкам цвета по умолчанию.Как я могу прочитать настройки по умолчанию?
Например:
- У меня есть пользовательский параметр с именем
CellBackgroundColor
вProperties.Settings
. - Во время разработки я установил значение
CellBackgroundColor
ДляColor.White
используя IDE. - Пользовательские наборы
CellBackgroundColor
ДляColor.Black
в моей программе. - Я сохраняю настройки с помощью
Properties.Settings.Default.Save()
. - Пользователь нажимает на
Restore Default Colors
кнопка.
Сейчас, Properties.Settings.Default.CellBackgroundColor
ВОЗВРАТ Color.Black
.Как мне вернуться к Color.White
?
Решение
@ozgur,
Settings.Default.Properties["property"].DefaultValue // initial value from config file
Пример:
string foo = Settings.Default.Foo; // Foo = "Foo" by default
Settings.Default.Foo = "Boo";
Settings.Default.Save();
string modifiedValue = Settings.Default.Foo; // modifiedValue = "Boo"
string originalValue = Settings.Default.Properties["Foo"].DefaultValue as string; // originalValue = "Foo"
Другие советы
Читая "Программирование форм Windows 2.0", я наткнулся на эти 2 полезных метода, которые могут помочь в данном контексте:
База настроек приложений.Перезагрузить
База настроек приложений.Сброс
Из MSDN:
Перезагрузка отличается от сброса тем, что первая загружает последний набор сохраненных значений настроек приложения, тогда как вторая загружает сохраненные значения по умолчанию.
Таким образом, использование было бы:
Properties.Settings.Default.Reset()
Properties.Settings.Default.Reload()
Я не совсем уверен, что это необходимо, должен быть более аккуратный способ, в противном случае надеюсь, что кто-то найдет это полезным;
public static class SettingsPropertyCollectionExtensions
{
public static T GetDefault<T>(this SettingsPropertyCollection me, string property)
{
string val_string = (string)Settings.Default.Properties[property].DefaultValue;
return (T)Convert.ChangeType(val_string, typeof(T));
}
}
использование;
var setting = Settings.Default.Properties.GetDefault<double>("MySetting");
Properties.Settings.Default.Reset()
сбросит все настройки до их первоначального значения.
Я решил эту проблему, установив 2 набора настроек.Я использую тот, который Visual Studio добавляет по умолчанию для текущих настроек, т.е. Properties.Settings.Default
.Но я также добавляю другой файл настроек в свой проект "Проект -> Добавить новый элемент -> Общие -> Файл настроек" и сохраняю там фактические значения по умолчанию, т.е. Properties.DefaultSettings.Default
.
Затем я удостоверяюсь, что никогда не напишу в Properties.DefaultSettings.Default
настройки, просто прочитайте из него.Изменение всего обратно к значениям по умолчанию - это всего лишь пример возврата текущих значений к значениям по умолчанию.
Как мне вернуться к цвету.Белый?
Есть два способа, которыми вы можете это сделать:
- Сохраните копию настроек до того, как пользователь их изменит.
- Кэшируйте измененные пользователем настройки и сохраните их в свойствах.Настройки перед закрытием приложения.
Я нашел это призвание ApplicationSettingsBase.Reset
это привело бы к сбросу настроек до значений по умолчанию, но в то же время и к их сохранению.
Поведение, которое я хотел, состояло в том, чтобы сбросить их до значений по умолчанию, но не сохранять их (чтобы, если пользователю не понравились значения по умолчанию, пока они не были сохранены, он мог вернуть их обратно).
Я написал метод расширения, который подходил для моих целей:
using System;
using System.Configuration;
namespace YourApplication.Extensions
{
public static class ExtensionsApplicationSettingsBase
{
public static void LoadDefaults(this ApplicationSettingsBase that)
{
foreach (SettingsProperty settingsProperty in that.Properties)
{
that[settingsProperty.Name] =
Convert.ChangeType(settingsProperty.DefaultValue,
settingsProperty.PropertyType);
}
}
}
}