如何获取存储在Xamarin Preferences中的所有偏好设置项
Xamarin.Forms 获取所有Preferences键的可行方案
方案1:通过依赖服务调用原生接口获取(推荐、最准确)
Xamarin.Essentials的Preferences本质是对各平台原生偏好存储的封装,你可以通过原生接口直接读取所有存储的键:
- 首先在共享项目中定义服务接口
public interface IPreferencesService { // 获取所有已存储的Preferences键 IEnumerable<string> GetAllKeys(string sharedName = null); }
- 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; } } }
- 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>(); } } }
- 共享项目调用示例
// 获取所有键 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
相关产品推荐
相关产品推荐

