C# UWP项目中修改资源文件字符串值失败,求解决方法
在UWP C#中修改资源字符串的正确方式
嘿,你遇到的问题很常见——ResourceLoader本身是只读的,它根本没有setString()方法,所以你的代码肯定跑不起来😅。UWP里的资源文件处理分两种情况,我给你详细说说:
一、最常用:用本地设置覆盖包内资源(无法修改原始包文件)
应用安装后,包内的.resw资源文件是只读的,不能直接修改。所以常规做法是把需要动态修改的字符串存在本地设置里,读取时优先取本地设置的值,没有的话再读原始资源:
读取动态字符串的方法
private string GetDynamicResourceString(string resourceKey) { // 先检查本地设置是否有修改后的存储值 if (ApplicationData.Current.LocalSettings.Values.TryGetValue(resourceKey, out var storedValue)) { return storedValue.ToString(); } // 没有的话读取原始资源文件 var loader = ResourceLoader.GetForCurrentView(); return loader.GetString(resourceKey); }
修改并保存字符串的方法
private void SetDynamicResourceString(string resourceKey, string newValue) { // 把修改后的值存在本地设置里 ApplicationData.Current.LocalSettings.Values[resourceKey] = newValue; }
这样用户修改后,下次读取就会用新值,原始包内的资源文件不会被改动,这是UWP处理动态文本的标准方案。
二、特殊需求:修改本地文件夹中的自定义资源文件
如果你确实需要修改资源文件本身,可以把.resw文件复制到应用的LocalFolder(可写目录),然后通过ResourceManager来操作:
1. 启动时复制资源文件到本地目录(仅第一次执行)
private async Task CopyResourceToLocalFolderAsync() { var localFolder = ApplicationData.Current.LocalFolder; var targetFile = await localFolder.TryGetItemAsync("CustomResources.resw"); // 只有当本地没有这个文件时才复制 if (targetFile == null) { var packageFile = await Package.Current.InstalledLocation.GetFileAsync("CustomResources.resw"); await packageFile.CopyAsync(localFolder); } }
注意:要把你的CustomResources.resw文件设置为"复制到输出目录:如果较新则复制"
2. 修改和读取本地资源文件
// 获取本地资源文件的ResourceMap private ResourceMap GetLocalResourceMap() { var localFolder = ApplicationData.Current.LocalFolder; var resourceContext = ResourceContext.GetForCurrentView(); var resourceManager = new ResourceManager("CustomResources", localFolder); return resourceManager.MainResourceMap; } // 修改资源值并保存到文件 public async Task ModifyLocalResourceAsync(string resourceKey, string newValue) { var resourceMap = GetLocalResourceMap(); resourceMap[resourceKey].SetValue(newValue); // 保存修改到本地文件 await resourceMap.SaveAsync(); } // 读取修改后的资源值 public string GetLocalResource(string resourceKey) { var resourceMap = GetLocalResourceMap(); return resourceMap[resourceKey].GetValueAsString(); }
这种方式要注意资源文件的XML格式正确性,ResourceMap.SaveAsync()会帮你处理,但要确保应用有足够的文件权限。
内容的提问来源于stack exchange,提问作者Miguel Genaro
相关产品推荐
相关产品推荐

