Как сохранить значение параметра пользователя при изменении свойства перемещения параметра?

Я понял, что могу сохранить пользовательские настройки из предыдущих версий, используя такой код:

        if (Settings.Default.UpgradeRequired)
        {
            Settings.Default.Upgrade();
            Settings.Default.UpgradeRequired = false;
            Settings.Default.Save();
        }

Однако это не сработает, если я изменю свойство роуминга настройки. Есть ли способ сделать так, чтобы значения настроек переносились, а не сбрасывались, когда я изменяю настройку с роуминга на локальную или наоборот?

РЕДАКТИРОВАТЬ: я рассмотрел возможный способ обновления параметров роуминга до локальных параметров с помощью файла GetPreviousVersion(), но он не работает, потому что, если предыдущая версия параметра перемещалась, а текущий параметр не перемещался, предыдущая версия не возвращается. вообще.

Чтобы воспроизвести:

  1. Сделайте настройку с именем MySetting.
  2. Измените свойство Roaming MySetting на true.
  3. Убедитесь, что область действия MySetting равна User.
  4. Запустите следующий код:

        Console.WriteLine(Settings.Default.GetPreviousVersion("MySetting"));
        Settings.Default.MySetting = "Not the default value.";
        Settings.Default.Save();
    
  5. Увеличьте версию сборки.
  6. Запустите код еще раз, заметив, что выводится новое значение.
  7. Измените свойство Roaming MySetting на false.
  8. Снова увеличьте версию сборки.
  9. Запустите код еще раз, заметив, что выводится значение по умолчанию.

person Kyle Delaney    schedule 19.07.2017    source источник


Ответы (1)


Если вы знаете, какие свойства изменились с roaming=true на roaming=false, вы можете вручную добавить SettingsManageabilityAttribute в словарь SettingsProperty.Attributes, использовать GetPreviousVersion для получения предыдущего значения, а затем удалить атрибут из словаря для очистки:

Console.WriteLine("Current: {0}", Settings.Default.MySetting);
// we don't see the previous value here...
Console.WriteLine("Previous: {0}", Settings.Default.GetPreviousVersion("MySetting"));
// ...so we manually add the SettingsManageabilityAttribute to it...
var setting = Settings.Default.Properties["MySetting"];
setting.Attributes.Add(typeof(SettingsManageabilityAttribute), new SettingsManageabilityAttribute(SettingsManageability.Roaming));
// ...retrieve the previous value...
Console.WriteLine("Previous: {0}", Settings.Default.GetPreviousVersion("MySetting"));
// ...and then clean up after ourselves by removing the attribute.
setting.Attributes.Remove(typeof(SettingsManageabilityAttribute));
// ...now we don't see the previous value anymore.
Console.WriteLine("Previous: {0}", Settings.Default.GetPreviousVersion("MySetting"));
person wablab    schedule 04.08.2017