当我更改设置的漫游属性时,如何保留用户设置的值?

时间:2017-07-19 14:30:00

标签: c# visual-studio upgrade settings roaming

我已经明白我可以使用以下代码保留以前版本的用户设置:

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

但是,如果我更改设置的漫游属性,那似乎不起作用。当我将设置从漫游更改为本地或反之时,有没有办法让设置值继续进行而不能重置?

编辑:我研究了使用GetPreviousVersion()方法将漫游设置升级到本地设置的可能方法,但它不起作用,因为如果当前设置不是先前版本的设置正在漫游,之前的版本根本没有退回。

重现:

  1. 进行名为MySetting的设置。
  2. 将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. 将MySetting的漫游属性更改为false
  8. 再次增加装配版本。
  9. 再次运行代码,注意到输出了默认值。

1 个答案:

答案 0 :(得分: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"));