You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF .NET6 MSIX应用更新时如何保留用户设置?

在MSIX环境下保留WPF .NET6应用的用户设置

1. 使用MSIX专属的用户数据存储位置

MSIX有严格的文件系统隔离规则,包目录是只读的,更新时会被完全替换,因此不能依赖传统的Properties.Settings.Default存储用户自定义设置。必须把设置放到独立于包的用户数据文件夹,推荐直接调用UWP的ApplicationData API(WPF .NET6可直接兼容):

// 获取本地用户数据文件夹(更新操作不会影响该目录)
var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
// 打开已存在的设置文件,不存在则创建
var settingsFile = await localFolder.CreateFileAsync("UserSettings.json", 
    Windows.Storage.CreationCollisionOption.OpenIfExists);

// 读取用户设置
var settingsContent = await Windows.Storage.FileIO.ReadTextAsync(settingsFile);
var userSettings = JsonSerializer.Deserialize<YourCustomSettingsClass>(settingsContent);

// 修改设置后写回文件
userSettings.Theme = "Dark";
await Windows.Storage.FileIO.WriteTextAsync(settingsFile, 
    JsonSerializer.Serialize(userSettings));

该文件夹路径类似C:\Users\<用户名>\AppData\Local\Packages\<包全名>\LocalState,完全独立于MSIX包,更新时不会被覆盖。

2. 迁移旧版设置(如果之前用了Settings.Default)

如果之前依赖Properties.Settings.Default存储设置,需要在应用启动时做一次一次性迁移:

// 先在项目设置里新增布尔型项IsSettingsMigrated,默认值设为false
if (!Properties.Settings.Default.IsSettingsMigrated)
{
    // 读取旧设置数据
    var oldFontSize = Properties.Settings.Default.FontSize;
    var oldAutoSave = Properties.Settings.Default.AutoSave;

    // 将旧数据写入新的存储位置
    var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
    var settingsFile = await localFolder.CreateFileAsync("UserSettings.json", 
        Windows.Storage.CreationCollisionOption.OpenIfExists);
    var newSettings = new YourCustomSettingsClass
    {
        FontSize = oldFontSize,
        AutoSave = oldAutoSave
    };
    await Windows.Storage.FileIO.WriteTextAsync(settingsFile, 
        JsonSerializer.Serialize(newSettings));

    // 标记迁移完成,避免重复执行
    Properties.Settings.Default.IsSettingsMigrated = true;
    Properties.Settings.Default.Save();
}

3. 加载设置时合并默认值

不要直接用默认设置覆盖用户配置,应该优先读取用户设置,缺失的项再用默认值填充,这样即使应用新增设置项也能兼容旧配置:

public async Task<YourCustomSettingsClass> LoadSettings()
{
    // 定义应用默认设置
    var defaultSettings = new YourCustomSettingsClass
    {
        FontSize = 12,
        AutoSave = true,
        Theme = "Light"
    };

    try
    {
        var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
        var settingsFile = await localFolder.GetFileAsync("UserSettings.json");
        var content = await Windows.Storage.FileIO.ReadTextAsync(settingsFile);
        var userSettings = JsonSerializer.Deserialize<YourCustomSettingsClass>(content);

        // 合并逻辑:用户未设置的项用默认值补充
        if (userSettings.FontSize == 0)
            userSettings.FontSize = defaultSettings.FontSize;
        if (userSettings.Theme == null)
            userSettings.Theme = defaultSettings.Theme;

        return userSettings;
    }
    catch (FileNotFoundException)
    {
        // 无用户设置时返回默认值
        return defaultSettings;
    }
}

4. 为什么Settings.Default.Upgrade()无效?

ClickOnce的Upgrade()方法是针对ClickOnce的版本升级机制设计的,而MSIX的包模型为每个版本分配独立的只读目录,旧版本的Settings.Default数据存放在旧包目录中,新版本无法访问,因此Upgrade()无法跨版本读取旧设置,必须改用独立的用户数据存储方案。

内容的提问来源于stack exchange,提问作者Owen Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:10:18