Не удается обновить настройки при обновлении универсального приложения 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();
}
}
}