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

如何获取存储在Xamarin Preferences中的所有偏好设置项

Xamarin.Forms 获取所有Preferences键的可行方案

方案1:通过依赖服务调用原生接口获取(推荐、最准确)

Xamarin.Essentials的Preferences本质是对各平台原生偏好存储的封装,你可以通过原生接口直接读取所有存储的键:

  1. 首先在共享项目中定义服务接口
public interface IPreferencesService
{
    // 获取所有已存储的Preferences键
    IEnumerable<string> GetAllKeys(string sharedName = null);
}
  1. Android平台实现
[assembly: Dependency(typeof(PreferencesServiceAndroid))]
namespace 你的应用命名空间.Droid
{
    public class PreferencesServiceAndroid : IPreferencesService
    {
        public IEnumerable<string> GetAllKeys(string sharedName = null)
        {
            var prefName = string.IsNullOrEmpty(sharedName) 
                ? $"{Android.App.Application.Context.PackageName}.xamarinessentials" 
                : sharedName;
            var sharedPref = Android.App.Application.Context.GetSharedPreferences(prefName, FileCreationMode.Private);
            return sharedPref.All.Keys;
        }
    }
}
  1. iOS平台实现
[assembly: Dependency(typeof(PreferencesServiceiOS))]
namespace 你的应用命名空间.iOS
{
    public class PreferencesServiceiOS : IPreferencesService
    {
        public IEnumerable<string> GetAllKeys(string sharedName = null)
        {
            var suiteName = string.IsNullOrEmpty(sharedName) 
                ? "Xamarin.Essentials.Preferences" 
                : sharedName;
            var userDefaults = NSUserDefaults.FromSuite(suiteName);
            return userDefaults.ToDictionary().Keys.Cast<string>();
        }
    }
}
  1. 共享项目调用示例
// 获取所有键
var allKeys = DependencyService.Get<IPreferencesService>().GetAllKeys();
// 筛选你需要的键(比如前缀为dynamic_的键)
var targetKeys = allKeys.Where(k => k.StartsWith("dynamic_"));
// 读取对应值
foreach(var key in targetKeys)
{
    var value = Preferences.Get(key, string.Empty);
    // 处理业务逻辑
}

方案2:应用内自行维护动态键列表(无原生代码、实现简单)

如果你不想写平台原生代码,可以在存储动态生成的偏好键时,同步维护一个固定键的键列表:

  • 每次新增动态键时,先读取固定键all_dynamic_keys存储的键列表,把新键加入后再存回去
  • 需要读取所有动态键时,直接读取all_dynamic_keys拆分得到全部键即可

这个方案的缺点是如果偏好被外部修改,会出现列表不同步的问题,仅适合所有偏好修改都在应用内完成的场景。

注意:如果你调用Preferences接口时指定了自定义的sharedName,需要在获取原生存储实例时传入对应的名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:18:02