更新 WPF Desktop Bridge Universal 应用程序时无法升级设置

Ton*_*eel 6 c# wpf windows-10-universal desktop-bridge

我的应用程序是用 WPF C# 编写的,我直接从 Visual Studio 使用 MSIX 应用程序项目将其导出为通用应用程序。

我只是无法让设置在更新之间保持不变。我在MainWindow_Loaded事件中使用以下代码:

Settings.Default.Upgrade();
Settings.Default.Save();
Settings.Default.Reload();
Run Code Online (Sandbox Code Playgroud)

我尝试保持程序集信息版本相同,只是增加 appx.manifest 中的版本,但它不起作用。

我注意到,每次应用程序更新时,它都会创建一个新的唯一命名的父设置文件夹(每次都有新的哈希值),并且子文件夹名称是程序集中的版本。文件夹结构是这样的:

App.exe_Url_dfvfmfjs1qo33zsag1ay5w1s0rwg0u53/0.2.10.0/user.config

App.exe_Url_tazrvujdga5ujjarnahpkoscv5zbkgl0/0.2.10.0/user.config

我相信这可能与它不断生成新的哈希值而不是仅仅将新版本作为子文件夹放置这一事实有关,这就是升级不执行任何操作的原因。

到目前为止我发现的唯一信息是使用Settings.Default.Upgrade()

当我的通用桌面桥接应用程序更新时,我该如何将旧版本设置转移到新版本?

Ton*_*eel 0

据我研究,这些设置不会转移到使用 Desktop Bridge 的 UWP 更新。于是我开始使用UWP原生的ApplicationData.Settings

作为解决方法,我创建了 2 种方法来更新新创建的 WPF 设置,使用LocalSettingsUWP 等效项,反之亦然。UWPLocalSettings更新时的传输。我Update()在保存 WPF 设置时调用,Load()在应用程序启动时调用。有用。

这是代码,到目前为止我发现的唯一警告是您应该使用基本类型,因为这些方法将无法传输类似 aList<string>或 a 的内容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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)