当我更改设置的漫游 属性 时,如何保留用户设置的值?
How do I preserve a user setting's value when I change the setting's roaming property?
我了解到我可以使用如下代码保留以前版本的用户设置:
if (Settings.Default.UpgradeRequired)
{
Settings.Default.Upgrade();
Settings.Default.UpgradeRequired = false;
Settings.Default.Save();
}
但是,如果我更改设置的漫游 属性,这似乎不起作用。当我将设置从漫游更改为本地或反之时,有什么方法可以让设置值继续使用而不是重置?
编辑:我研究了一种使用 GetPreviousVersion()
方法将漫游设置升级为本地设置的可能方法,但它不起作用,因为如果当前设置为漫游时以前版本的设置正在漫游't,之前的版本根本不返回
重现:
- 创建一个名为 MySetting 的设置。
- 将 MySetting 的漫游 属性 更改为
true
。
- 确保 MySetting 的范围是
User
。
运行代码如下:
Console.WriteLine(Settings.Default.GetPreviousVersion("MySetting"));
Settings.Default.MySetting = "Not the default value.";
Settings.Default.Save();
- 增加程序集版本。
- 运行 再次输入代码,注意输出了新值。
- 将 MySetting 的漫游 属性 更改为
false
。
- 再次增加程序集版本。
- 运行 再看一遍代码,注意输出的是默认值。
如果您知道哪些属性已从 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"));
我了解到我可以使用如下代码保留以前版本的用户设置:
if (Settings.Default.UpgradeRequired)
{
Settings.Default.Upgrade();
Settings.Default.UpgradeRequired = false;
Settings.Default.Save();
}
但是,如果我更改设置的漫游 属性,这似乎不起作用。当我将设置从漫游更改为本地或反之时,有什么方法可以让设置值继续使用而不是重置?
编辑:我研究了一种使用 GetPreviousVersion()
方法将漫游设置升级为本地设置的可能方法,但它不起作用,因为如果当前设置为漫游时以前版本的设置正在漫游't,之前的版本根本不返回
重现:
- 创建一个名为 MySetting 的设置。
- 将 MySetting 的漫游 属性 更改为
true
。 - 确保 MySetting 的范围是
User
。 运行代码如下:
Console.WriteLine(Settings.Default.GetPreviousVersion("MySetting")); Settings.Default.MySetting = "Not the default value."; Settings.Default.Save();
- 增加程序集版本。
- 运行 再次输入代码,注意输出了新值。
- 将 MySetting 的漫游 属性 更改为
false
。 - 再次增加程序集版本。
- 运行 再看一遍代码,注意输出的是默认值。
如果您知道哪些属性已从 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"));