Windows 通过 Desktop Bridge 将表单发送到 UWP 应用程序 - 用户设置 lost/reset UWP 应用程序升级
Windows Forms to UWP app via Desktop Bridge - User Settings are lost/reset on UWP app Upgrade
我已经使用 Desktop Bridge 的最新版本(通过 Visual Studio 2017 年的打包项目)将我的 Windows Forms(桌面)应用程序转换为 UWP,现在正在测试 UWP 安装和我的应用程序的升级过程。当我的应用程序通过先前的方法(ClickOnce / .MSI / Windows 安装程序)部署时,当我的应用程序升级到更高版本时,我的用户设置(首选项)被正确迁移和保留。在 UWP 下,所有用户设置在升级时都是 lost/reset。我的问题与此线程中描述的问题相同(未提供解决方案):
Here is the prior thread I found, same issue, no resolution
关于如何正确保留通过桌面桥引入 UWP 的桌面应用程序的用户设置有什么想法吗?
谢谢!
将数据存储在ApplicationData.LocalSettings。
https://docs.microsoft.com/en-us/windows/uwp/design/app-settings/store-and-retrieve-app-data
您可以将以前的 user.config 文件加载到当前设置中。这只是一种解决方法,可用于过渡到 ApplicationData.LocalSettings.
public static void Init() {
LoadPreviousSettings(ApplicationSettings.Default, MyFancySettings.Default);
}
private static void LoadPreviousSettings(params ApplicationSettingsBase[] applicationSettings)
{
const string companyName = "YOUR_COMPANY_NAME_HERE";
var userConfigXml = GetUserConfigXml(companyName);
Configuration config = ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal);
foreach (ApplicationSettingsBase setting in applicationSettings)
{
try
{
// loads settings from user.config into configuration
LoadSettingSection(setting, config, userConfigXml);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("userSettings");
}
catch (FileNotFoundException)
{
// Could not import settings.
}
setting.Reload();
}
}
private static void LoadSettingSection(ApplicationSettingsBase setting, Configuration config, XDocument userConfigXml)
{
string appSettingsXmlName = setting.ToString();
var settings = userConfigXml.XPathSelectElements("//" + appSettingsXmlName);
config.GetSectionGroup("userSettings")
.Sections[appSettingsXmlName]
.SectionInformation
.SetRawXml(settings.Single().ToString());
}
private static XDocument GetUserConfigXml(string companyName)
{
var localPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + $@"\{companyName}";
// previous package folder
var previousLocal = GetDirectoryByWriteTime(localPath, 1);
// previous version, e.g. 1.2.0
var prevousVersion = GetDirectoryByWriteTime(previousLocal, 0);
// application settings for previous version
return XDocument.Load(prevousVersion + @"\user.config");
}
private static string GetDirectoryByWriteTime(string path, int order)
{
var direcotires = new DirectoryInfo(path).EnumerateDirectories()
.OrderBy(d => d.LastWriteTime)
.Reverse()
.ToList();
if (direcotires.Count > order)
{
var previous = direcotires[order];
return previous.FullName;
}
throw new FileNotFoundException("Previous config file not found.");
}
我已经使用 Desktop Bridge 的最新版本(通过 Visual Studio 2017 年的打包项目)将我的 Windows Forms(桌面)应用程序转换为 UWP,现在正在测试 UWP 安装和我的应用程序的升级过程。当我的应用程序通过先前的方法(ClickOnce / .MSI / Windows 安装程序)部署时,当我的应用程序升级到更高版本时,我的用户设置(首选项)被正确迁移和保留。在 UWP 下,所有用户设置在升级时都是 lost/reset。我的问题与此线程中描述的问题相同(未提供解决方案):
Here is the prior thread I found, same issue, no resolution
关于如何正确保留通过桌面桥引入 UWP 的桌面应用程序的用户设置有什么想法吗?
谢谢!
将数据存储在ApplicationData.LocalSettings。
https://docs.microsoft.com/en-us/windows/uwp/design/app-settings/store-and-retrieve-app-data
您可以将以前的 user.config 文件加载到当前设置中。这只是一种解决方法,可用于过渡到 ApplicationData.LocalSettings.
public static void Init() {
LoadPreviousSettings(ApplicationSettings.Default, MyFancySettings.Default);
}
private static void LoadPreviousSettings(params ApplicationSettingsBase[] applicationSettings)
{
const string companyName = "YOUR_COMPANY_NAME_HERE";
var userConfigXml = GetUserConfigXml(companyName);
Configuration config = ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal);
foreach (ApplicationSettingsBase setting in applicationSettings)
{
try
{
// loads settings from user.config into configuration
LoadSettingSection(setting, config, userConfigXml);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("userSettings");
}
catch (FileNotFoundException)
{
// Could not import settings.
}
setting.Reload();
}
}
private static void LoadSettingSection(ApplicationSettingsBase setting, Configuration config, XDocument userConfigXml)
{
string appSettingsXmlName = setting.ToString();
var settings = userConfigXml.XPathSelectElements("//" + appSettingsXmlName);
config.GetSectionGroup("userSettings")
.Sections[appSettingsXmlName]
.SectionInformation
.SetRawXml(settings.Single().ToString());
}
private static XDocument GetUserConfigXml(string companyName)
{
var localPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + $@"\{companyName}";
// previous package folder
var previousLocal = GetDirectoryByWriteTime(localPath, 1);
// previous version, e.g. 1.2.0
var prevousVersion = GetDirectoryByWriteTime(previousLocal, 0);
// application settings for previous version
return XDocument.Load(prevousVersion + @"\user.config");
}
private static string GetDirectoryByWriteTime(string path, int order)
{
var direcotires = new DirectoryInfo(path).EnumerateDirectories()
.OrderBy(d => d.LastWriteTime)
.Reverse()
.ToList();
if (direcotires.Count > order)
{
var previous = direcotires[order];
return previous.FullName;
}
throw new FileNotFoundException("Previous config file not found.");
}