Не удается обновить настройки при обновлении универсального приложения WPF Desktop Bridge

Мое приложение написано на WPF C#, и я экспортирую его как универсальное приложение с помощью MSIX Application Project прямо из Visual Studio.

Я просто не могу сохранить настройки между обновлениями. Я использую следующий код вMainWindow_Loaded событие:

Settings.Default.Upgrade();
Settings.Default.Save();
Settings.Default.Reload();

Я попытался сохранить версии информации о сборке одинаковыми и просто увеличить версию в appx.manifest, но это не сработало.

Я заметил, что каждый раз, когда приложение обновляется, оно создает новую папку родительских настроек с уникальным именем (каждый раз с новым хешем), а имя подпапки - это версия из сборки. Структура папок такая:

App.exe_Url_dfvfmfjs1qo33zsag1ay5w1s0rwg0u53/0.2.10.0/user.config

App.exe_Url_tazrvujdga5ujjarnahpkoscv5zbkgl0/0.2.10.0/user.config

Я считаю, что это может быть связано с тем, что он продолжает генерировать новые хэши, а не просто помещать новую версию в подпапку, и поэтому Upgrade ничего не делает.

Единственная информация, которую я нашел до сих пор, - это использовать Settings.Default.Upgrade()

Как мне перенести настройки старой версии в новую при обновлении приложения универсального настольного моста?

Насколько я понял, я думаю, что эти настройки не переносятся в обновления UWP с помощью Desktop Bridge. Итак, я начал использовать собственный UWPApplicationData.SettingsВ качестве обходного пути я создал 2 метода для обновления вновь созданных настроек WPF, используя LocalSettingsкоторый является эквивалентом UWP, и наоборот. UWPLocalSettingsперенос по обновлению. Я звонюUpdate() когда я сохраняю свои настройки WPF и вызываю Load()при запуске приложения. Оно работает. Вот код:

static class UWPSettings
    {
        public static void Update()
        {
            if (Startup.IsUniversalPlatform)
            {
                foreach (SettingsPropertyValue value in Properties.Settings.Default.PropertyValues)
                {
                    ApplicationData.Current.LocalSettings.Values[value.Name] = value.PropertyValue;
                }
            }
        }

        public static void Load()
        {
            if (Startup.IsUniversalPlatform)
            {
                foreach (var setting in ApplicationData.Current.LocalSettings.Values)
                {
                    foreach (SettingsPropertyValue s in Properties.Settings.Default.PropertyValues)
                    {
                        if (s.Name == setting.Key)
                        {
                            s.PropertyValue = setting.Value;
                        }
                    }
                }

                Properties.Settings.Default.Save();
            }
        }
    }

0 ответов

Насколько я понял, эти настройки не переносятся в обновления UWP с помощью Desktop Bridge. Итак, я начал использовать собственный UWP ApplicationData.Settings

В качестве обходного пути я создал 2 метода для обновления вновь созданных настроек WPF, используя LocalSettingsкоторый является эквивалентом UWP, и наоборот. UWP LocalSettingsперенос по обновлению. Я звоню Update() когда я сохраняю свои настройки WPF и вызываю Load()при запуске приложения. Оно работает.

Вот код, единственное предостережение, которое я обнаружил до сих пор, заключается в том, что вы должны использовать базовые типы, поскольку эти методы не смогут передать что-то вроде List<string> или StringCollection, для этого я использую сериализацию, хотя вы всегда можете адаптировать их для этого:

static class UWPSettings
    {
        public static void Update()
        {
            if (Startup.IsUniversalPlatform)
            {
                foreach (SettingsPropertyValue value in Properties.Settings.Default.PropertyValues)
                {
                    ApplicationData.Current.LocalSettings.Values[value.Name] = value.PropertyValue;
                }
            }
        }

        public static void Load()
        {
            if (Startup.IsUniversalPlatform)
            {
                foreach (var setting in ApplicationData.Current.LocalSettings.Values)
                {
                    foreach (SettingsPropertyValue s in Properties.Settings.Default.PropertyValues)
                    {
                        if (s.Name == setting.Key)
                        {
                            s.PropertyValue = setting.Value;
                        }
                    }
                }

                Properties.Settings.Default.Save();
            }
        }
    }
Другие вопросы по тегам