【问题标题】:Can't upgrade settings when updating a WPF Desktop Bridge Universal app更新 WPF 桌面桥通用应用程序时无法升级设置
【发布时间】:2020-09-11 20:56:35
【问题描述】:

我的应用是用 WPF C# 编写的,我使用 MSIX 应用程序项目直接从 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

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

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

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

【问题讨论】:

  • 您能否分享更多详细信息,您如何使用 Visual Studio 制作 MSIX 包?
  • 我遵循了这个:LinkLink 基本上是导入一个 MSIX 应用程序打包项目并通过将其目标设置为我的 WPF 项目来使用它来部署和发布。
  • 我查看了案例更新,是正确的。
  • 好的,所以我想没有更好的方法可以做到这一点,只能编写您自己的传输方法(复制到 UWP 设置和从 UWP 设置复制)或同时使用两者。我可以尝试将我的所有设置迁移到 UWP 设置并在 ClickOnce 部署中使用它,但我不确定结果会是什么(如果在更新 ClickOnce 应用程序时设置会正确升级)。如果我尝试,我会在这里发布更新。

标签: c# wpf windows-10-universal desktop-bridge


【解决方案1】:

据我研究,这些设置不会使用桌面桥传输到 UWP 更新。于是我开始使用UWP原生的ApplicationData.Settings

作为一种解决方法,我创建了 2 种方法来使用 LocalSettings 更新新创建的 WPF 设置,这是 UWP 等效项,反之亦然。 UWP 的LocalSettings 在更新时传输。我在保存 WPF 设置时调用 Update(),在应用程序启动时调用 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();
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 2019-06-18
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多