Приложение Windows Forms к UWP через Desktop Bridge - пользовательские настройки теряются / сбрасываются при обновлении приложения UWP

Я преобразовал свое приложение Windows Forms (для настольных ПК) в UWP, используя последнюю итерацию Desktop Bridge (через пакетный проект в Visual Studio 2017), и сейчас тестирую процессы установки и обновления UWP для моего приложения. Когда мое приложение было развернуто с использованием предыдущей методологии (ClickOnce / .MSI / Windows Installer), мои пользовательские настройки (настройки) были правильно перенесены и сохранены при обновлении моего приложения до более поздней версии. Под UWP все пользовательские настройки теряются / сбрасываются при обновлении. Моя проблема - та же самая проблема, которая была описана в этой теме (для которой не было предоставлено никакого решения):

Вот предыдущая тема, которую я нашел, та же проблема, без разрешения

Любые идеи о том, как правильно сохранить пользовательские настройки для приложения рабочего стола, переданного в UWP через Desktop Bridge?

Спасибо!

1 ответ

Решение

Сохраните данные в 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.");
}
Другие вопросы по тегам